2017-02-11 85 views
0

JSON-文件:如何正确解析以下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]], 
"isFrozen":"0","seq":254407265 
} 

这是我用JSON的文档工作第一的expirience。我尽我所能。这行得通。但我认为这是错误的方式。因为在我的实现中缺少TJSONPair类,不像网上的很多例子。包含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; 
+1

当迭代最里面的阵列,'获取(1)'没有返回'TJSONString',它返回一个'TJSONNumber'代替。如果您使用过“铸造”,那么您会发现该错误。你应该使用'TJSONArray.Items []'而不是'TJSONArray.Get()'。而且肯定是['TJSONPair'](http://docwiki.embarcadero.com/Libraries/en/System.JSON.TJSONPair)类。 –

+0

你说得对,'Get(1)'return'TJSONNumber',谢谢你的提示。关于'TJSONArray.Items []',我可能会被误解,但是在XE2后''Items'被替换为'Get'。在我使用的XE5的'TJSONArray'中没有'Item'。 – HeathRow

+0

你是对的。当JSON类被移动到新的'System.JSON'单元时,在XE6中添加了'TJSONArray.Items'。 “*警告:'Get'已弃用,请使用'Items'。*” –

回答

0

我劝你沟内置JSON类,而不是从亨利Gourvest用出色的SuperObject类。他们已经有更长的时间,更好的测试,更强大,更易于使用。

有了这些,你的代码将成为:

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;