2014-11-23 5 views
-1

Здравствуйте, я получаю следующий результат в веб-API в формате JSON:Прочитайте конкретное значение из запроса JSON с помощью надобъекта

[ 
    { 
     "$id":"47", 
     "CodISO":"BIH", 
     "ES":"Bosnia y Herzegovina", 
     "EN":"Bosnia and Herzegovina" 
    }, 
    { 
     "$id":"48", 
     "CodISO":"BLR", 
     "ES":"Bielorrusia", 
     "EN":"Belarus" 
    }, 
    { 
     "$id":"49", 
     "CodISO":"BLZ", 
     "ES":"Belice", 
     "EN":"Belize" 
    }, 
    { 
     "$id":"50", 
     "CodISO":"BOL", 
     "ES":"Bolivia", 
     "EN":"Bolivia" 
    }, 
    { 
     "$id":"51", 
     "CodISO":"BON", 
     "ES":"Bonaire", 
     "EN":"Bonaire" 
    }, 
    { 
     "$id":"52", 
     "CodISO":"BOT", 
     "ES":"Botsuana", 
     "EN":"Botswana" 
    }, 
    { 
     "$id":"53", 
     "CodISO":"BRA", 
     "ES":"Brasil", 
     "EN":"Brazil" 
    }, 
    { 
     "$id":"54", 
     "CodISO":"BRB", 
     "ES":"Barbados", 
     "EN":"Barbados" 
    } 
] 

Теперь я хочу прочитать значение из пункта «ES», где значение item 'CodISO' = 'BOL' в Delphi SuperObject, я не могу найти решение, весь день пробовал его.

Я не знаю, как итерация с элементами SuperObject, как я делаю это с Embarcadero TJSONValue, TJSONObject, TJSONArray. Я новичок с надобъекта:

var 
    json: ISuperObject; 
    Retriever: TIdHTTP; 
    Url: string; 
    AnsiStr: AnsiString; 
begin 
    URL := Form1.RestClient1.BaseURL; 
    try 
    Retriever := TIdHTTP.Create(nil); 
    try 
     AnsiStr := Retriever.Get(Url); 
     json := SO(AnsiStr); 
     { Here code to iterate with json elements in SuperObject....... 
     . 
     . 
     . 
     . 
     }    
    finally 
     Retriever.Free; 
    end; 
    except 
    on E: Exception do 
     ShowMessage(E.ClassName + ': ' + E.Message); 
    end; 
End; 
+2

«Я не в состоянии найти решение, взял весь день, пытаясь его» - что именно вы пробовали? Пожалуйста, покажите свой код. Это не должно занимать больше нескольких минут, если вы действительно посмотрите на доступный API SuperObject. JSON не имеет ничего подобного XPath для XML, поэтому вам нужно итерировать элементы вручную. Начиная с корневого массива, вы пробиваете элементы массива по одному за раз, читая поля 'CodISO' и' ES' по мере необходимости, а затем разбиваете цикл, когда найдете совпадение. Просто как тот. –

+2

Вы посмотрели [readme.html] (https://superobject.googlecode.com/git/readme.html) суперобъекта? Это намерение файла readme, вы должны прочитать, чтобы получить дополнительную информацию –

ответ

1

Как сказал сэр Rufo, вам нужно прочитать SuperObject documentation.

попробовать что-то вроде этого:

var 
    JsonArr, JsonObj: ISuperObject; 
    Retriever: TIdHTTP; 
    Url, JsonStr, ES: string; 
    I: Integer; 
begin 
    URL := Form1.RestClient1.BaseURL; 
    try 
    Retriever := TIdHTTP.Create(nil); 
    try 
     JsonStr := Retriever.Get(Url); 
    finally 
     Retriever.Free; 
    end; 
    JsonArr := SO(JsonStr).AsArray; 
    for I := 0 to JsonArr.Length-1 do 
    begin 
     JsonObj := JsonArr.O[I]; 
     if JsonObj.S['CodISO'] = 'BOL' then 
     begin 
     ES := JsonObj.S['ES']; 
     Break; 
     end; 
    end; 
    except 
    on E: Exception do 
     ShowMessage(E.ClassName + ': ' + E.Message); 
    end; 
end;