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