SuperObject - 从带有"."的字段名解析数据.文字

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>是数值).因此,我不能依赖于返回的已知数据类型.

然而,主要问题是,由于字段名称中的点,尝试从该字段读取值显然会失败.

Mar*_*ema 7

不需要黑客攻击.您只需要通过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)