2017-02-11 8 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 
} 

Это мой первый Expirience работы с JSON-документов. Я сделал это, как могу. Это работает. Но я думаю, что это было неправильно. Потому что в моей реализации отсутствует класс 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

При переборе сокровенные массивов 'Get (1)' не возвращает 'TJSONString', он возвращает' TJSONNumber' вместо этого. Вы бы обнаружили эту ошибку, если использовали 'as' cast. И вы должны использовать '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, который я использую, нет 'Item' в' TJSONArray'. – HeathRow

+0

Вы правы. 'TJSONArray.Items' был добавлен в XE6, когда классы JSON были перенесены в новый блок' System.JSON'. "* Предупреждение:' Get' устарел. Используйте 'Items'. *" –

ответ

0

Я бы посоветовал вам канаву встроенных классов JSON, и вместо этого использовать отличные SuperObject классов от Генри 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;