如何在Delphi中解析此类JSON数据?

时间:2020-06-03 16:01:15

标签: json parsing delphi

如何在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
    }
}

1 个答案:

答案 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; 结束;