2017-02-11 78 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;