在消息框中显示字符串数据

Display string data in message box

为什么这不适用于 TJSONObject?

procedure TForm1.Button5Click(Sender: TObject);
var
  js : TJSONObject;
  isoDate1, isoDate2, data : string;
begin
  isoDate1 := '2018-01-02T10:00:00.000Z';
  isoDate2 := '2018-01-02T10:10:00.000Z';

  js := TJSONObject.Create;
  js.AddPair(TJsonPair.Create(isoDate1, 'TEST'));
  js.AddPair(TJsonPair.Create(isoDate2, 'TEST2'));

  outputdebugstring(pchar(js.ToString));

  if js.TryGetValue<string>(isoDate1, data) then begin
    ShowMessage(data);
  end else begin
    ShowMessage('data non trouvé pour ' + isoDate1);
  end;
end;

output : Sortie de débogage: {"2018-01-02T10:00:00.000Z":"TEST","2018-01-02T10:10:00.000Z":"TEST2"} Processus Project1.exe (6232)

预期结果:
TryGetValue 应该在 data
中放入一个字符串 ShowMessage 应该在消息框中给我 'TEST'。

结果:
ShowMessage 给我 'data non trouvé pour 2018-01-02T10:00:00.000Z'.

问题是您使用 TryGetValue method call. Dot char path parser (TJSONPathParser) 查询的 JSON 路径中的点被解释为对的键分隔符,其值即将被获取。因此,例如这样调用:

if JSONObject.TryGetValue<string>('Foo.Bar', S) then
  DoSomething;

是对对象的值的查询,如下所示:

{"Foo": {"Bar": "The value"}}

不适用于 具有这样命名的键的值

{"Foo.Bar": "The value"}

因此,在您的情况下,您试图查询 2018-01-02T10:00:00 对象的键 000Z 的值,这需要这样的对象:

{"2018-01-02T10:00:00": {"000Z": "TEST"}}

这个 JSON 路径点符号此时是硬编码的(不可能在查询路径中转义点字符),所以唯一的方法是此时放弃该方法,或者从中丢失点键名。

问题出在您密钥中的点。它用作分隔符。 Delphi 将“2018-01-02T10:00:00”解释为将“000Z”作为 属性.

的对象

我建议获取这样的值:

var
...
  LJsonValue: TJSONValue;
begin
...

  LJsonValue := js.GetValue(isoDate1);
  if Assigned(LJsonValue) then
    ShowMessage(LJsonValue.Value);

...
end;