QMsgPack 更新 – 修正了ItemByName/ItemByPath 的几处Bug

【问题描述】

1、ItemByName 函数的一个重载没有处理 MsgPackCaseSensitive 属性,造成 MsgPackCaseSensitive 为 False 时,可能得不到需要的结果的问题。注意此重载不支持按数组下标方式来获取列表,只支持按实际名称比较。

function ItemByName(const AName: QStringW; AList: TQJsonItemList;ANest: Boolean = False): Integer; overload;

2、ItemByName 函数的一个重载没有正确处理数组下标的问题。

function ItemByName(AName: QStringW): TQMsgPack;

问题发生在数组下标的名称解析的逻辑设计上,原设计在取当前数组子结点时,包含数组结点的名称,而这显示不符合常规。如下面的 MsgPack 结构:

with AMsgPack.Add('a',mptArray) do
   begin   
   Add.AsInteger:=0;
   AChild:=Add;
   AChild.DataType:=mptArray;
   AChild.Add.AsInteger:=1;
   AChild.Add.AsInteger:=2;
   Add.AsInteger:=3;
   end;

如果按照原设计,如果我们已经通过 ItemByName 获得 a 对应的 TQMsgPack 结点对象,则需要按下面的表达式来获取其第一个元素:

ANode.ItemByName('a[0]')

新的设计修正成:

ANode.ItemByName('[0]')

3、ItemByPath 函数没有正确处理多维数组下标的问题。

原设计考虑了一维数组的情况,没有考虑多维数组访问的问题,会造成找不到指定的结点。同样是上面的用例,

如果使用ItemByPath来访问第2个元素的第一个子元素,正确的路径应为“a[1][0]”,但原设计会返回空,新设计修正了这一问题。

【更新级别】

推荐

【严重程度】

 

分享到: