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 函数调整全局的二进制数据编码方式,它将影响其后所有上述三种方式的数据解析。