在消息框中显示字符串数据
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;
为什么这不适用于 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;