json - 使用 Delphi 7 解析 JSON

标签 json delphi

我有一个 JSON 文件,需要对其进行解析以提取一些值。

示例如下所示:

[
  {
    "period": "2016-06-07 - 2016-06-14",
    "range": "2016-06-07..2016-06-14",
    "items": [
      {
        "region_name": "Canterbury/Otago",
        "region_id": 12,
        "average_cover": 2099,
        "average_growth": 16,
        "reading_count": 3
      },
      {
        "region_name": "Southland",
        "region_id": 14,
        "average_cover": 2068,
        "average_growth": 3,
        "reading_count": 1
      },
      {
        "region_name": "Wairarapa \u0026 Hawkes Bay",
        "region_id": 10,
        "average_cover": 2195,
        "average_growth": 20,
        "reading_count": 2
      }
    ]
  },
  {
    "period": "2016-05-31 - 2016-06-07",
    "range": "2016-05-31..2016-06-07",
    "items": [
      {
        "region_name": "Canterbury/Otago",
        "region_id": 12,
        "average_cover": 2126,
        "average_growth": 17,
        "reading_count": 5
      },
      {
        "region_name": "Southland",
        "region_id": 14,
        "average_cover": 2181,
        "average_growth": 10,
        "reading_count": 2
      }
    ]
  },
  {
    "period": "2016-05-24 - 2016-05-31",
    "range": "2016-05-24..2016-05-31",
    "items": [
      {
        "region_name": "Canterbury/Otago",
        "region_id": 12,
        "average_cover": 2139,
        "average_growth": 28,
        "reading_count": 6
      },
      {
        "region_name": "Central Plateau",
        "region_id": 6,
        "average_cover": 2400,
        "average_growth": 38,
        "reading_count": 1
      },
      {
        "region_name": "Wairarapa \u0026 Hawkes Bay",
        "region_id": 10,
        "average_cover": 2254,
        "average_growth": 27,
        "reading_count": 2
      }
    ]
  },
  {
    "period": "2016-05-18 - 2016-05-25",
    "range": "2016-05-18..2016-05-25",
    "items": [
      {
        "region_name": "Canterbury/Otago",
        "region_id": 12,
        "average_cover": 2183,
        "average_growth": 39,
        "reading_count": 6
      },
      {
        "region_name": "Manawatu",
        "region_id": 9,
        "average_cover": 2315,
        "average_growth": 42,
        "reading_count": 1
      },
      {
        "region_name": "Wairarapa \u0026 Hawkes Bay",
        "region_id": 10,
        "average_cover": 2228,
        "average_growth": 29,
        "reading_count": 2
      }
    ]
  },
  {
    "period": "2016-05-10 - 2016-05-17",
    "range": "2016-05-10..2016-05-17",
    "items": [
      {
        "region_name": "Canterbury/Otago",
        "region_id": 12,
        "average_cover": 2251,
        "average_growth": 40,
        "reading_count": 8
      },
      {
        "region_name": "Otago",
        "region_id": 13,
        "average_cover": 2595,
        "average_growth": 26,
        "reading_count": 1
      },
      {
        "region_name": "Southland",
        "region_id": 14,
        "average_cover": 2526,
        "average_growth": 49,
        "reading_count": 2
      },
      {
        "region_name": "Waikato",
        "region_id": 4,
        "average_cover": 2484,
        "average_growth": 60,
        "reading_count": 1
      },
      {
        "region_name": "Wairarapa \u0026 Hawkes Bay",
        "region_id": 10,
        "average_cover": 2201,
        "average_growth": 34,
        "reading_count": 2
      }
    ]
  }
]

我要提取的项目是 region_idaverage_coveraverage_growth

我已成功从第一个 items 数组中提取值,但我的示例 JSON 文件包含 4 个 items 数组,而且我似乎只能从第一个 items 元素。

我一直在使用 ulkJSON.pas 库,我的 Delphi 代码如下所示,将值发送到表单上的 TMemo:

var 
  js: TlkJSONBase;
  Items: TlkJSONbase;
  I: Integer;
  lHTTP: TIdHTTP;
  sJSON: String;      
begin
  sJSON :=  // as per sample JSON text in question
  js := TlkJSON.ParseText(sJSON);
  Items := js.Field['items'];
  for I := 0 to Pred(Items.Count) do begin
    Memo1.Lines.Add(VarToStr(Items.Child[I].Field['region_id'].Value));
    Memo1.Lines.Add(VarToStr(Items.Child[I].Field['average_cover'].Value));
    Memo1.Lines.Add(VarToStr(Items.Child[I].Field['average_growth'].Value));
  end;
end;

最佳答案

您没有考虑顶级数组。此代码适用于所示的 JSON:

var 
  sJSON: String;      
  js, Items, Item: TlkJSONBase;
  I, J: Integer;
begin
  sJSON :=  // as per sample JSON text in question
  js := TlkJSON.ParseText(sJSON);
  for I := 0 to Pred(js.Count) do
  begin
    Items := js.Child[I].Field['items'];
    for J := 0 to Pred(Items.Count) do begin
      Item := Items.Child[J];
      Memo1.Lines.Add(VarToStr(Item.Field['region_id'].Value));
      Memo1.Lines.Add(VarToStr(Item.Field['average_cover'].Value));
      Memo1.Lines.Add(VarToStr(Item.Field['average_growth'].Value));
    end;
  end;
end;

关于json - 使用 Delphi 7 解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845434/

相关文章:

delphi - 如何在电子邮件地址中的单词 "com"之前添加点?

java - 如何创建对象的 JSONObject?安卓

json - 将多个变量保存到 NSUserdefaults 并按保存顺序显示在另一个 View Controller 上的最佳方法是什么?

delphi - Delphi在哪里存储项目的目录和条件定义设置?

c# - 如何判断是否连接到互联网

multithreading - 如何在不创建Windows句柄的情况下将消息传递到TApartmentThread实例

javascript - 如何访问 JSON 中的特定对象

Php 文件内容到多个表

javascript - 根据 geojson 数据在传单 map 上绘制标记

android - 在Android下使用Delphi在TWebbrowser中全屏观看youtube或其他视频时出现问题