获取xsuperobject以将未命名的数组解析为tobject结构

时间:2017-01-09 21:54:00

标签: json delphi delphi-10.1-berlin

我正在使用Delphi 10.1 Berlin Update 2,并尝试使用XSuperObject / XSuperJSON从第三方提供商处获取JSON响应并将其解析为对象结构。

这是JSON:

[ 
  {
    "yardNumber": 10,
    "links": [
      {
        "rel": "yardSaleList",
        "href": "<url address>"
      }
    ],
    "yardName": "Yard A",
    "auctionDate": "1/25/17"
  },
  {
    "yardNumber": 10,
    "links": [
      {
        "rel": "yardSaleList",
        "href": "<url>"
      }
    ],
    "yardName": "Yard B",
    "auctionDate": "1/25/17"
  }
] 

我的代码是这样的:

TLinkItem = class
public
  [alias('rel')]
  rel: String;
  [alias('href')]
  href: string;
end;    

TPartItem = class
public
  [alias('yardNumber')]
  YardNumber: integer;
  [alias('links')]
  Links: TObjectList<TLinkItem>;
  [alias('yardName')]
  YardName: string;
  [alias('auctionDate')]
  AuctionDate: String; 
  destructor destroy; override;
end;

TPartItems = class  /// not used because this is an unnamed JSON array
public
  [alias('ItemData')] 
  ItemData : TObjectList<TPartItem>;     
end;

...

destructor TPartItems.destroy;
begin
  freeandnil(Links);
  inherited;
end;

如果是命名数组,我可以使用上面的对象来引用名称 数组:

myData := TPartItems.FromJSON(jsonString); 
showmssage(myData.ItemData.count.toString);

但是因为这是一个未命名的数组,我不能这样做。

我希望我在这里找不到一些我找不到的细节。 到目前为止,这与其他数据供应商的合作非常好,但是 我从未遇到像这样的未命名的JSON数组。

2 个答案:

答案 0 :(得分:1)

我查看了XSuperObject的源代码,但没有看到任何允许您显示的JSON直接将未命名的数组流式传输到TPartItems的内容。所以,我建议简单地将JSON数组包装在一个JSON对象中,该对象为数组提供一个名称,例如:

myData := TPartItems.FromJSON('{ItemData: ' + jsonString + '}');

答案 1 :(得分:0)

基本上,您可以对@Remy Lebeau进行补充

sResponse := '{"arr":'+sResponse+'}'; 
XSO := SO(sResponse);

for I := 0 to XSO.A['arr'].Length-1 do
begin
   XSO.A['arr'].o[i].S['yardNumber'];
   //....
end;