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

时间:2018-02-02 15:03:13

标签: delphi delphi-10.1-berlin

为什么这不适用于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;
  

输出:Sortiededébogage:{“2018-01-02T10:00:00.000Z”:“TEST”,“2018-01-02T10:10:00.000Z”:“TEST2”} Processus Project1.exe(6232 )

预期结果:
TryGetValue应该在数据中添加一个字符串 ShowMessage应该在消息框中给我'TEST'。

结果:
ShowMessage给我'数据非麻烦倾注2018-01-02T10:00:00.000Z'。

2 个答案:

答案 0 :(得分:2)

问题是您使用TryGetValue方法调用查询的JSON路径中的点。 Dot char路径解析器(TJSONPathParser)解释为对的关键分隔符,其值即将获得。所以,例如这样调用:

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路径点表示法此时是硬编码的(不可能在查询路径中转义点字符),因此唯一的方法是此时放弃该方法,或者丢失键名称中的点。

答案 1 :(得分:2)

问题是你的密钥中的点。它被用作分隔符。 德尔福解释了2018-01-02T10:00:00&#39;作为具有&#39; 000Z&#39;作为财产。

我会建议得到这样的价值:

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

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

...
end;