Mar*_*son 4 delphi json delphi-xe4
我一直在努力解决这个问题,做一些简单的事情似乎花了太长时间.
我有这样一个文件:
[
{
"FirstName": "Oleg",
"Surname": "Buckley"
},
{
"FirstName": "Amery",
"Surname": "Mcmillan"
},
{
"FirstName": "Denton",
"Surname": "Burnett"
....
Run Code Online (Sandbox Code Playgroud)
我希望能够将它们读入我的程序.到目前为止,我已经完成了这个非常小的功能:
function GetGeneratedNames: TArray<string>;
var fileName: TFileName;
JSONValue, jv: TJSONValue;
JSONArray: TJSONArray;
jo: TJSONObject;
pair: TJSONPair;
begin
result := nil;
filename := ExePath + 'Names.json';
JSONValue := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(TFile.ReadAllText(filename)), 0);
if JSONValue is TJSONArray then begin
for jv in (JSONValue as TJSONArray) do begin
if jv is TJSONObject then begin
jo := jv as TJSONObject;
for pair in jo do begin
Append(result, jo.Value);
end;
end;
end;
end;
end{ GetGeneratedNames};
Run Code Online (Sandbox Code Playgroud)
麻烦的是,它返回一个空字符串数组.谁能指出我正确的方向?
TIA马克
// XE5- version
uses System.SysUtils, Data.DBXJSON, System.IOUtils;
function GetGeneratedNames: TArray<string>;
var
fileName: TFileName;
JSONValue, jv: TJSONValue;
begin
fileName := TPath.Combine(ExePath, 'Names.json');
JSONValue := TJSONObject.ParseJSONValue(TFile.ReadAllText(fileName));
try
if JSONValue is TJSONArray then
begin
for jv in TJSONArray(JSONValue) do
begin
Append(Result, (jv as TJSONObject).Get('FirstName').JSONValue.Value);
Append(Result, (jv as TJSONObject).Get('Surname').JSONValue.Value);
end;
end;
finally
JSONValue.Free;
end;
end { GetGeneratedNames };
// XE6+ version
uses System.SysUtils, System.JSON, System.IOUtils;
function GetGeneratedNames: TArray<string>;
var
fileName: TFileName;
JSONValue, jv: TJSONValue;
begin
fileName := TPath.Combine(ExePath, 'Names.json');
JSONValue := TJSONObject.ParseJSONValue(TFile.ReadAllText(fileName));
try
if JSONValue is TJSONArray then
begin
for jv in TJSONArray(JSONValue) do
begin
Append(Result, jv.GetValue<string>('FirstName'));
Append(Result, jv.GetValue<string>('Surname'));
end;
end;
finally
JSONValue.Free;
end;
end { GetGeneratedNames };
Run Code Online (Sandbox Code Playgroud)
您没有从数组项中读取正确的值。
尝试这样的事情:
//...
var
JSONArr: TJSONArray;
Item: TJSONValue;
FirstName, Surname, WholeObject: String;
begin
//...
JSONArr := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(TFile.ReadAllText(filename)), 0);
try
for Item in JSONArr do
begin
// Get the first or last names
FirstName := (Item as TJSONObject).GetValue('FirstName').Value;
Surname := (Item as TJSONObject).GetValue('Surname').Value;
// Get the whole string {"FirstName": "Oleg", "Surname": "Buckley"}
WholeObject := Item.ToString;
end;
finally
JSONArr.Free;
end;
// do something with them ...
end;
Run Code Online (Sandbox Code Playgroud)
JSON 对象包含值对,但它本身没有值,因此您会得到空字符串。如果您想要整个对象文本,您应该使用“ToString”方法。
如果您碰巧处理大量数据,则SuperObject或XSuperObject确实更易于使用且速度更快。第二个似乎也适用于 iOS/Android,虽然我没用过。
| 归档时间: |
|
| 查看次数: |
11425 次 |
| 最近记录: |