将JSON解析为TListBox

Sco*_*ard 8 delphi json delphi-xe2 cloudflare firemonkey

晚上好!

我目前正在尝试CloudFlare为桌面组装一个客户端.我已经连接到他们的API并使用POST请求成功检索了JSON结果(结果已输出到a TMemo).我现在想要将这些结果解析为TListBox(例如,参见粗体区域).该项目正在设计中Firemonkey.

这是带有一些示例内容的响应的格式化布局;

{
 - response: {
   |- ips: [
      |- {
         ip: "xxx.xxx.xxx.xxx",
         classification: "threat",
         hits: xx,
         latitude: null,
         longitude: null,
         zone_name: "domain-example1"
         },
       - {
         ip: "yyy.yyy.yyy.yyy",
         classification: "robot",
         hits: yy,
         latitude: null,
         longitude: null,
         zone_name: "domain-example2"
         }
       ]
   }
  result : "success",
  msg: null
}
Run Code Online (Sandbox Code Playgroud)

我尝试了几个不同的组件--SuperObject,PawełGłowacki的JSON Designtime Parser,Tiny-JSON,LKJSON和内置的DBXJSON.但是,我根本没有使用JSON的经验,我似乎无法找到可以从中开始的最基本的示例.他们中的许多人都展示了样本数据,但我尝试的所有数据似乎都没有像我期望的那样工作,很可能是因为我误解了它们.我假设组件有效,所以我需要有关入门的指导.

ips"数组"中有数百个,通常是数千个结果(如果不正确,我会道歉,我认为它被称为数组,但我又是JSON的新手).

我真正需要的是一些非常基本的示例代码,我可以构建它(以及它用于解析等的组件).

例如,如果我想ip从JSON结果中获取每个结果,并将每个结果作为一个单独的项目放入TListBox(使用TListBox.add方法),我将如何实现这一目标?

当我说ip,我的意思是价值(在上面的格式化布局中,这将是xxx.xxx.xxx.xxxyyy.yyy.yyy.yyy).

另外,如果我想从JSON结果中通过它的IP找到"记录"(?)并将数据输出到delphi数组 - 例如;

Result : Array of String = ['"xxx.xxx.xxx.xxx"','"threat"','xx','null','null','"domain-example1"'];
Run Code Online (Sandbox Code Playgroud)

用JSON可以吗?(如果这被视为一个单独的问题或者过于无关,请随意编辑,而不是将问题作为一个整体关闭).

我得到这个最接近的,不仅有知识产权的,而是在一个单独的所有其他数据块TListItem(即response,ips,ip,classification,xxx.xxx.xxx.xxx和一切有它自己的项目,在每一个非空项目之间的几个空的项目一起).

我确信这样做非常简单,但是关于JSON的信息非常多,对于那些刚接触该格式的人来说,它有点压倒性.

最诚挚的问候,Scott Pritchard.

Mas*_*ler 8

一旦理解了基本概念,JSON就非常简单易懂.看看http://json.org,它解释了一些事情.

JSON中有4个基本概念:

是任何JSON元件:一个基本的字符串或数字,数组或一个对象.(除了一对之外的任何东西.)

一个数组应该是一个熟悉的概念:值的有序列表.与Delphi数组的主要区别在于JSON数组没有为元素定义的类型; 它们只是"一组JSON值".

是键值对.键可以是字符串或数字,值可以是任何JSON值.

一个目的是JSON对关联映射.你可以从概念上把它想象成一个TDictionary<string, JSON value>.

因此,如果我想获取这样的JSON数据,并将其放在TListBox中,我会做这样的事情(DBXJSON示例,警告:未经测试):

procedure TMyForm.LoadListBox(response: TJSONObject);
var
  i: integer;
  ips: TJSONArray;
  ip: TJSONObject;
  pair: TJSONPair;
begin
  ListBox.Clear;
  pair := response.Get('ips');
  if pair = nil then
    Exit;
  ips := pair.value as TJSONArray;
  for i := 0 to ips.size - 1 do
  begin
    ip := ips.Get(i) as TJSONObject;
    pair := ip.Get('ip');
    if pair = nil then
      ListBox.AddItem('???', ip.Clone)
    else ListBox.AddItem(pair.JsonString, ip.Clone);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

然后,您有一个IP地址列表,以及包含完整记录的关联对象,如果用户选择了该记录,则可以获得该记录.(如果你想将每个记录的全部内容放入列表控件中,请查看TListView.它比TListBox那更好.)

如果要构建包含所有值的字符串数组,请执行以下操作:

function JsonObjToStringArray(obj: TJsonObject): TArray<string>;
var
  i: integer;
begin
  SetLength(result, obj.Size);
  for i := 0 to obj.Size - 1 do
    result[i] := obj.Get(i).JsonValue.ToString;
end;
Run Code Online (Sandbox Code Playgroud)

当然,这只是示例代码,但它应该为您提供一些内容.