如何在Delphi中解析以下Json?
这是我的第一篇文章,在问这个问题之前,我已经尽力进行了尽可能多的搜索, 所以请告诉我是否以任何方式张贴错误。
我想在“记录”数组中获取“ name_of_centre”的值
谢谢您的帮助。
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
jsonRoot: TJSONValue;
jsonObj: TJSONObject;
jsonArr: TJSONArray;
begin
jsonRoot := TJSONObject.ParseJSONValue(memo2.Lines.text);
try
jsonObj := jsonRoot as TJSONObject;
jsonObj := jsonObj.GetValue('result') as TJSONObject;
jsonArr := jsonObj.GetValue('records') as TJSONArray;
showmessage( jsonArr.Count.ToString ); // works ok
for i := 0 to jsonArr.Count - 1 do
begin
jsonObj := jsonArr.Items[i] as TJSONObject;
showmessage( jsonObj.GetValue('name_of_centre').Value ); // error here
end;
finally
jsonRoot.Free;
end;
end;
我已经结帐了 Delphi parsing a Json with multiple array types?
How to parse this json data in Delphi 10 Seattle? (尤其是这个)
和其他一些链接...但是JSON格式似乎不同。
有什么建议吗?
{
"help": "testing",
"success": true,
"result": {
"resource_id": "data_resource",
"fields": [
{
"type": "int4",
"id": "_id"
},
{
"type": "text",
"id": "name_of_centre"
},
{
"type": "text",
"id": "location_of_centre"
},
{
"type": "text",
"id": "type_of_centre"
},
{
"type": "text",
"id": "owner"
},
{
"type": "numeric",
"id": "no_of_outlets"
},
{
"type": "numeric",
"id": "no_of_branches"
}
],
"records": [
{
"location_of_centre": "Kings Road",
"no_of_outlets": "12",
"no_of_branches": "0",
"name_of_centre": "Kings Road Centre",
"type_of_centre": "HC",
"owner": "Private",
"_id": 1
},
{
"location_of_centre": "Queens",
"no_of_outlets": "14",
"no_of_branches": "1",
"name_of_centre": "Queens Centre",
"type_of_centre": "HC",
"owner": "Public",
"_id": 2
}
],
"_links": {
"start": "ignore",
"next": "ignore2"
},
"limit": 2,
"total": 10
}
}
答案 0 :(得分:0)
感谢众多回复。
奥利维尔(Olivier):我已在此修订代码中包含错误。
Peter:我尝试使用 jsonRoot.GetValue('result.records [0] .name_of_centre') 它确实为我提供了name_of_centre的值。好的开始。 但是我希望获得此代码,以便为我提供Array中的项数,并迭代该数组,而不是硬代码。谢谢。
Remy:但是奇怪的是,它今天有效。没有无效的类型转换 在showmessage(jsonObj.GetValue('name_of_centre')。Value);
fpiette:我使用Delphi 10.3 RIO。
感谢大家的回复。
是否需要使用jsonRoot.Free; -我在stackoverflow.com上的帖子中看到了这一点... jsonObj.Free怎么样?
jsonRoot := TJSONObject.ParseJSONValue(memo2.Lines.text);
try
jsonObj := jsonRoot as TJSONObject;
jsonObj := jsonObj.GetValue('result') as TJSONObject;
showmessage( jsonObj.ToString );
jsonArr := jsonObj.GetValue('records') as TJSONArray;
showmessage( jsonArr.Count.ToString );
for i := 0 to jsonArr.Count - 1 do
begin
jsonObj := jsonArr.Items[i] as TJSONObject;
if jsonObj .GetValue('name_of_centre').Value = null then
showmessage('null');
//以前有无效的类型转换 showmessage(jsonObj.GetValue('name_of_centre')。Value); 结束; 最后 jsonRoot.Free; 结束;