[QJSON] 常见问题及解答

1、如何创建根结点为数组类型的JSON对象?

直接设置根结点的 DataType 为 jdtArray 即可。然后数组的子元素只需要挨个调用 Add 添加即可。

2、如何遍历 JSON 子结点的信息?

QJson 的 Count 属性记录了数组或对象的子结点数量,然后您可以使用正常的循环来遍历子元素,如:

var
  AItem:TQJson;
  I:Integer;
begin
...
for I:=0 to AJson.Count-1 do
   begin
   AItem:=AJson[I];
   //AItem 现在指向了第 I 个结点,然后直接访问其属性
   end;
...
end;

同时,QJson 支持 foreach 语法来遍历子结点,你可以用下面的语法来处理:

for AItem in AJson do
   begin
   //AItem....
   end;

3、TQJson 的子结点是否需要单独释放?

不需要。子结点将随着父结点一起释放。所以,下面的代码是错误的:

var
  AJson,AChild:TQJson;
begin
AJson:=TQJson.Create;
try
   AJson.Parse('{"a":1}");
   AChild:=AJson.ItemByName('a');
finally
   FreeAndNil(AJson);
   FreeAndNil(AChild);//多余
end;

4、为啥 FromRtti 时,有些类型没有 RTTI 信息?

参照这篇文章 :https://blog.qdac.cc/?p=1305

5、如何通过路径访问指定的数组元素?

XXXByPath 或 XXXByName 函数支持按数组方式访问某一子元素,如下面的写法是正确的:

AJson.ItemByName('[0].name');

这种方式同时支持数组和对象子元素的访问。所以,对于下面的Json:

{
"jone":{
  "name":"jone grey"
  }
}

如果我们按 ValueByPath(‘[0].name”,””) 可以得到值 “jone grey”。同样的,我们通过 ValueByPath(‘jone.name’,”) 也可以得到 “jone grey” 这个值。

6、QJson 结点怎么赋值?

这个是初学者可能迷糊的地方。QJson 提供了很多方法为结点赋值:

  • AsXXX:按指定的类型为指定的结点赋值,如 AJson.AsInteger:=100 会将指定 AJson 结点的值为整数100。这些方法会同时修改结点的类型。
  • ResetNull:指定的结点的值重置为NULL。
  • Value:这个会尝试按当前设定的类型将指定的字符串转换为相应的值。如果当前结点类型未知,则会尝试检测内容的类型来赋值。
  • AsJson:赋值一个Json字符串。QJson 将直接尝试解析这个 Json 字符串,如果无法解析,则当做普通的字符串值来处理,此时等价于 AsString。
  • AsVariant:将一个 Variant 的值转换为对应的 Json 结点。Json 结点的值类型会根据 Variant 的数据类型而自动变更。

您可以根据需要,选择上面的任意方法来赋值。

7、QJson 结点如何存取二进制数据?

有几种方法:

  • ValueFromStream/StreamFromValue 可以直接从流中赋值或将值保存到流中;
  • ValueFromFile/FileFromValue 可以直接从文件中赋值或将值保存到文件中;
  • 使用 AsBytes 属性直接操作二进制数据;

注意,二进制数据编码默认是直接转换成十六进制存贮,如果你想使用Base64,请调用 EncodeJsonBinaryAsBase64 函数调整全局的二进制数据编码方式,它将影响其后所有上述三种方式的数据解析。

分享到: