如何使用SuperObject序列化包含点(例如IP地址)的JSON密钥?

时间:2014-03-26 06:13:24

标签: json delphi parsing ip-address superobject

我试图保存JSON,其中IP是关键。预期的JSON结果是:

{"SnmpManagers":[{"10.112.25.235":162}]}

Delphi SuperObject代码:

const
  IpAddr = '10.112.25.235';
  Port = 162;
var
  tmp: TSuperObject;
begin
  tmp := TSuperObject.Create;
  tmp.I[IpAddr] := Port;
  Json.A['SnmpManagers'].Add(tmp);
end;

SuperObject将点解析为JSON对象的路径分隔符:

{"SnmpManagers":[{"10":{"112":{"25":{"235":162}}}}]}

如何使用SuperObject正确地将IP保存为JSON密钥?

2 个答案:

答案 0 :(得分:6)

解决方案是从字符串

创建JSON对象
Json.A['SnmpManagers'].Add(SO(Format('{"%s":%d}', [IpAddr, Port])));

添加的另一种方法(不要使用.O [],因为AsObject为非现有键提供nil):

// for a simple key-value object
Json.AsObject.S['1.2.3'] := 'a'; // gives us {{"1.2.3":"a"}}
Json.AsObject.S['4.5'] := 'b'; // gives us {{"1.2.3":"a"}, {"4.5":"b"}}

答案 1 :(得分:1)

这也有效:

var    
  tmp: ISuperObject;
begin
  tmp := SO([IpAddr, port]);
  Json.A['SnmpManagers'].Add(tmp);