gpt4 book ai didi

json - 如何在Delphi中使用TJSONIterator备份多个级别?

转载 作者:行者123 更新时间:2023-12-03 15:32:00 32 4
gpt4 key购买 nike

我一直在尝试在 Delphi 10.2.2 中使用 TJSONIterator。简短的问题是“如何在迭代器中上升两层?”

以下代码说明了我的问题:

JsonRec := '{"v1":"Main","v2":"1.1","v3":{"id":"X45","mod":1.5,"r2":{"rv1":"99190","rv2":"TX"}},"v4":"ok","v5":69}';

PDS.Open;
PDS.Append;
StringReader := TStringReader.Create(JsonRec);
JsonTextReader := TJsonTextReader.Create(StringReader);
Iterator := TJSONIterator.Create(JsonTextReader);
If Iterator.Next('v1') Then
PDS['Type'] := Iterator.AsString;
If Iterator.Next('v2') Then
PDS['Version'] := Iterator.AsString;
If Iterator.Next('v3') Then
Begin
Iterator.Recurse;
If Iterator.Next('id') Then
PDS['BlackListInfo'] := Iterator.AsString;
If Iterator.Next('mod') Then
PDS['Speed'] := Iterator.AsDouble;
If Iterator.Next('r2') Then
begin
Iterator.Recurse;
if Iterator.Next('rv1') then
PDS['Serial'] := Iterator.AsString;
if Iterator.Next('rv2') then
PDS['Location'] := Iterator.AsString;
Iterator.Return;
end;
Iterator.Return; //Second Return does not go up a level.
if Iterator.Next('v4') then // Always fails
PDS['CRC'] := Iterator.AsString;
if Iterator.Next('v5') then
PDS['ReportID'] := Iterator.AsInteger;
PDS.Post;
End;

显然,我正在解析 JSON 字符串以将数据放入数据库 (PDS)。当我发出第二次返回时,我没有达到预期的水平,然后我找不到 v4。我怀疑我可能需要使用 Rewind 方法,但到目前为止我还找不到它的文档。

非常感谢任何帮助。

最佳答案

这个答案解释了如何实现你想要做的事情,但不使用 TJsonReader,这是为 delphi 制作的最差的 json 解析器(性能和可用性)之一。 (您可以使用此工具进行基准测试:https://svn.code.sf.net/p/alcinoe/code/demos/ALJsonDoc/win32/AljsonDocDemo.exe)

以 Alcinoe ( https://github.com/Zeus64/alcinoe ) 为例,代码非常简单(但任何其他 json 解析器也可以很好地完成此类工作)

MyJsonDoc := TalJsonDocumentU.create;
try
MyJsonDoc.loadFromJsonString('{"v1":"Main","v2":"1.1","v3":{"id":"X45","mod":1.5,"r2":{"rv1":"99190","rv2":"TX"}},"v4":"ok","v5":69}');
PDS['Type'] := MyJsonDoc.node.getchildNodeValueText('v1', ''{default});
PDS['Version'] := MyJsonDoc.node.getchildNodeValueText('v2', ''{default});
PDS['BlackListInfo'] := MyJsonDoc.node.getchildNodeValueText(['v3', 'id'], ''{default});
PDS['Speed'] := MyJsonDoc.node.getchildNodeValueFloat(['v3', 'mod'], 0{default});
PDS['Serial'] := MyJsonDoc.node.getchildNodeValueText(['v3', 'r2', 'rv1'], ''{default});
PDS['Location'] := MyJsonDoc.node.getchildNodeValueText(['v3', 'r2', 'rv2'], ''{default});
PDS['CRC'] := MyJsonDoc.node.getchildNodeValueText('v4', ''{default});
PDS['ReportID'] := MyJsonDoc.node.getchildNodeValueInt32('v5', 0{default});
finally
MyJsonDoc.free;
end;

关于json - 如何在Delphi中使用TJSONIterator备份多个级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49458583/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com