对于寻找这些答案的新读者。
关于这个函数,或者如果您重构JSON数据,甚至可以更简单?
function getData(JsonString: String; User: String; Field: String): String;
var
JSonValue: TJSonValue;
JsonArray: TJSONArray;
ArrayElement: TJSonValue;
FoundValue: TJSonValue;
begin
Result :='';
JsonValue := TJSonObject.ParseJSONValue(JsonString);
JsonArray := JsonValue as TJSONArray;
for ArrayElement in JsonArray do begin
FoundValue := ArrayElement.FindValue(User);
if FoundValue <> nil then begin
Result := ArrayElement.GetValue<string>(User + '.' + Field);
break;
end;
end;
end;
上述示例JSON代码的问题在于使用用户名称"a" "b"作为JSON-key{key:data}来表示用户数据。这样,您无法使用GetValue("a")搜索数据。通过以不同方式构造JSON数据可以使搜索过程更加容易。稍后我将给出一个例子。
处理给定的JSON数据的方法是使用FindValue,这样就可以检查是否存在具有key"a"或"b"的字段。
FoundValue := ArrayElement.FindValue("b");
if FoundValue <> nil then begin
Result := ArrayElement.GetValue<string>("b"+ '.' + "email");
break;
关于“解析JSON数组”问题:在将数据加载为TJSonObject后,您可以将数据转换为TJSONArray并迭代元素。
JsonValue := TJSonObject.ParseJSONValue(JsonString)
JsonArray := JsonValue as TJSONArray
for ArrayElement in JsonArray do begin
...
给定JSON数据的工作示例代码:
unit JsonArray1;
interface
uses System.JSON;
function getData2(JsonString: String; User: String; Field: String): String;
procedure Test1();
implementation
function getData2(JsonString: String; User: String; Field: String): String;
var
JSonValue: TJSonValue;
JsonArray: TJSONArray;
ArrayElement: TJSonValue;
FoundValue: TJSonValue;
begin
Result :='';
JsonValue := TJSonObject.ParseJSONValue(JsonString);
JsonArray := JsonValue as TJSONArray;
for ArrayElement in JsonArray do begin
FoundValue := ArrayElement.FindValue(User);
if FoundValue <> nil then begin
Result := ArrayElement.GetValue<string>(User + '.' + Field);
break;
end;
end;
end;
procedure Test1();
var
DataBase: String;
EmailAddress : String;
Username: String;
begin
DataBase := '[ {"a" : {"username":"aaa","email":"aaa@gmail.com"}},' +
'{"b" : {"username":"bbb","email":"bbb@gmail.com"}} ]';
EmailAddress := getData2(DataBase, 'b', 'email');
Username := getData2(DataBase, 'a', 'username');
end;
end.
正如已经提到的那样,通过使用适当的键重构JSON数据可以使查找数据的代码更加简单。因为用户数据之间存在1对1的关系,比如:"a":{},"b":{},所以很容易引入一个名为'用户'的键。同时向数组中添加一个名为'用户'的键会导致所有数据都有键。
'{"users" : [{ "user":"a", "username":"aaa","email":"aaa@gmail.com"},' +
'{ "user":"b", "username":"bbb","email":"bbb@gmail.com"}]}';
当您遍历用户时,现在可以使用新的 "user" 键来使用 GetValue。
if ArrayElement.GetValue<String>('user') = 'b' then begin
Result := ArrayElement.GetValue<String>('email');
通过为数组指定键,您现在可以使用以下代码获取该数组:
JsonArray := JsonValue.GetValue<TJSONArray>('users')
重组后的JSON数据的工作示例代码:
unit JsonArray2;
interface
uses System.JSON;
function getData2(JsonString: String; User: String; Field: String): String;
procedure Test2();
implementation
function getData2(JsonString: String; User: String; Field: String): String;
var
JSonValue: TJSonValue;
JsonArray: TJSONArray;
ArrayElement: TJSonValue;
FoundValue: TJSonValue;
begin
Result :='';
JsonValue := TJSonObject.ParseJSONValue(JsonString);
JsonArray := JsonValue.GetValue<TJSONArray>('users');
for ArrayElement in JsonArray do begin
if ArrayElement.GetValue<String>('user') = User then begin
Result := ArrayElement.GetValue<String>(Field);
break;
end;
end;
end;
procedure Test2();
var
DataBase: String;
EmailAddress : String;
Username: String;
begin
DataBase := '{"users" : [{ "user":"a", "username":"aaa","email":"aaa@gmail.com"},' +
'{ "user":"b", "username":"bbb","email":"bbb@gmail.com"}]}';
EmailAddress := getData2(DataBase, 'b', 'email');
Username := getData2(DataBase, 'a', 'username');
end;
end.
XSuperObject
而不是内置库。它易于使用且非常轻量级。 - Jerry Dodge