Как сериализовать ключ JSON, содержащий точки (например, IP-адрес), с помощью 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}}}}]}

Как правильно сохранить IP как ключ JSON с SuperObject?

2 ответа

Решение заключается в создании объекта JSON из строки

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

Другой способ добавить (не используйте с.O[], потому что AsObject дает ноль для несуществующих ключей):

// 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"}}

Это также работает:

var    
  tmp: ISuperObject;
begin
  tmp := SO([IpAddr, port]);
  Json.A['SnmpManagers'].Add(tmp);
Другие вопросы по тегам