如何正确解析以下包含数组的JSON文档
JSON文档:如何正确解析以下包含数组的JSON文档,json,delphi,delphi-xe5,Json,Delphi,Delphi Xe5,JSON文档: {"asks": [["0.01129999",0.9997237],["0.01130000",594.26412711],["0.01130826",0.23004724],["0.01130999",0.25231793]], "bids": [["0.01129800",174.30861783],["0.01128867",0.13287659],["0.01128817",0.0097447],["0.01127559",241.94881004]]
{"asks":
[["0.01129999",0.9997237],["0.01130000",594.26412711],["0.01130826",0.23004724],["0.01130999",0.25231793]],
"bids":
[["0.01129800",174.30861783],["0.01128867",0.13287659],["0.01128817",0.0097447],["0.01127559",241.94881004]],
"isFrozen":"0","seq":254407265
}
这是我第一次使用JSON文档。我尽可能做到了。它起作用了。但我认为这是错误的方式。因为在我的实现中缺少TJSONPair类,这与net中的许多示例不同。在我的案例中,是否有其他包含TJSONPair的实现变体
const
ArrString : array[0..1] of String = ('asks','bids');
var
JSONObject: TJSONObject;
JSONArray: TJSONArray;
i,j: integer;
...
JSONObject:=TJSONObject.ParseJSONValue(JSONString) as TJSONObject;
if Assigned(JSONObject) then
begin
for i := 0 to High(ArrString) do
begin
JSONArray := JSONObject.Get(ArrString[i]).JsonValue as TJSONArray;
for j := 0 to JSONArray.Size-1 do
begin
if j = 0 then Memo1.Lines.Add(ArrString[i]+':');
Memo1.Lines.Add(TJSONString(TJSONArray(JSONArray.Get(j)).Get(0)).Value+ ' ' +TJSONNumber(TJSONArray(JSONArray.Get(j)).Get(1)).ToString);
end;
end;
我建议您不要使用内置的JSON类,而是使用Henry Gourvest提供的优秀类。它们存在的时间更长,测试更好,功能更强大,使用更方便 有了这些,您的代码将变成:
procedure ParseJSON(const JSONString: string);
const ArrString: array of string = ['asks', 'bids'];
var JSON, Element: ISuperObject;
CurrentString: string;
begin
JSON := SO(JSONString);
for CurrentString in ArrString do
begin
Memo1.Lines.Add(CurrentString + ':');
for Element in JSON[CurrentString] do
Memo1.Lines.Add(Element.AsArray.S[0] + ' ' + Element.AsArray.D[1].ToString);
end;
end;
迭代最里面的数组时,
Get(1)
不会返回TJSONString
,而是返回TJSONNumber
。如果您将用作
强制转换,则会检测到该错误。您应该使用TJSONArray.Items[]
而不是TJSONArray.Get()
。这里肯定有一个类。您是对的,Get(1)
returnTJSONNumber
,谢谢您的提示。关于TJSONArray.Items[]
,我可能弄错了,但是在Get
重放了XE2Items
之后。我使用的XE5中的TJSONArray
中没有项<当JSON类被移动到新的System.JSON
单元时,在XE6中添加了code>TJSONArray.Items
。“警告:Get
已弃用。请使用项
”