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.xxx或yyy.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.
一旦理解了基本概念,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)
当然,这只是示例代码,但它应该为您提供一些内容.
| 归档时间: |
|
| 查看次数: |
11524 次 |
| 最近记录: |