Sco*_*ard 4 delphi json cloudflare firemonkey superobject
我最近在解析JSON时遇到了问题.您可以看到,在使用CloudFlare Client Interface API时,我想查找特定IP的"威胁评级".问题是由于API的设计,格式是这样的;
{
response: {
xxx.xxx.xxx.xxx: <value>,
calls_left: 299
},
result: "success",
msg: null
}
Run Code Online (Sandbox Code Playgroud)
xxx.xxx.xxx.xxx表示从中检索数据所需的字段名称.马上,你可能会看到我面临的问题; 假设解析字符串中的点字符是当前路径中的子级别.
<value>代表IP的实际评级.但是,从它返回的格式和数据类型会有所不同.对于不是威胁的IP,或者没有威胁等级的IP,它将false作为布尔值返回.在搜索引擎爬虫上,它返回"SE:<var>"(其中<var>是数值)字符串.在已知威胁上,它返回"BAD:<var>"(其中<var>是数值).因此,我不能依赖于返回的已知数据类型.
然而,主要问题是,由于字段名称中的点,尝试从该字段读取值显然会失败.
不需要黑客攻击.您只需要通过AsObject.然后使用名称(包括嵌入点)而不将其视为路径说明符.
const Line1 = '{'
+ #13#10' response: {'
+ #13#10' xxx.xxx.xxx.xxx: "somestring",'
+ #13#10' calls_left: "299"'
+ #13#10' },'
+ #13#10' result: "success",'
+ #13#10' msg: null'
+ #13#10'}';
var
super: ISuperObject;
res: ISuperObject;
begin
super := SO(Line1);
res := super.O['response'];
writeln('S[calls_left''] on res: ', res.S['calls_left']);
writeln('S[''xxx.xxx.xxx.xxx''] on res: ', res.S['xxx.xxx.xxx.xxx']);
writeln('Names: ', res.AsObject.GetNames.AsString);
writeln('Values: ', res.AsObject.GetValues.AsString);
writeln('S[''xxx.xxx.xxx.xxx''] on res: through AsObject: ',
res.AsObject.S['xxx.xxx.xxx.xxx']);
Run Code Online (Sandbox Code Playgroud)
给出以下结果:
S[calls_left'] on res: 299
S['xxx.xxx.xxx.xxx'] on res:
Names: ["calls_left","xxx.xxx.xxx.xxx"]
Values: ["299","somestring"]
S['xxx.xxx.xxx.xxx'] on res: through AsObject: somestring
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1727 次 |
| 最近记录: |