2014-11-23 146 views
-1

你好,我得到一個JSON格式的網絡API下一結果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」,其中的價值在Delphi SuperObject中,項目'CodISO'='BOL',我無法找到解決方案,花了一整天的時間嘗試它。

我不知道如何使用SuperObject元素迭代,因爲我使用Embarcadero TJSONValueTJSONObjectTJSONArray。我是一個新手與超對象:

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

「我無法找到解決辦法,採取了一整天它」 - 你究竟什麼嘗試?請顯示你的代碼。如果你真的看SuperObject的可用API,這應該不會超過幾分鐘。 JSON沒有任何類似於XML的XPath,因此您必須手動迭代這些項目。從根數組開始,根據需要循環訪問數組的項目,每次讀取它們的「CodISO」和「ES」字段,然後在找到匹配項時斷開循環。就那麼簡單。 – 2014-11-23 23:38:17

+2

你看看超級對象的[readme.html](https://superobject.googlecode.com/git/readme.html)嗎?這是自述文件的意圖,您應該閱讀以獲取更多信息 – 2014-11-24 00:28:47

回答

1

正如入佛門爵士說,你需要閱讀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;