我陷入尝试TJSONIterator
在Delphi 10.2.2中使用的问题。简短的问题是“我如何在两个级别上提升Iterator
?”
以下代码说明了我的问题:
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句