我正在使用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数组。
答案 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;