2012-04-17 61 views
3

我覺得很笨,但我一直在尋找這一段時間。我正在使用Google地理編碼器API,我需要一些關於json響應的幫助。這裏是一個JSONObject,我有:如何訪問JSONObject子字段?

{ 
"viewport": { 
    "southwest": { 
     "lng": -78.9233749802915, 
     "lat": 36.00696951970851 
    }, 
    "northeast": { 
     "lng": -78.92067701970849, 
     "lat": 36.0096674802915 
    } 
}, 
"location_type": "ROOFTOP", 
"location": { 
    "lng": -78.922026, 
    "lat": 36.0083185 
} 
} 

如何拉「位置」子欄到各自的變量?我試過jsonObjectVariable.getString("location");jsonObjectVariable.getDouble()等,但它沒有正確返回。你在json對象中調用了哪個子域?我讀過你可以使用object.subobject語法訪問子字段,但我只是沒有得到我需要的東西。

(我使用JSON-組織作爲庫)

感謝您的幫助!

+0

請張貼一些代碼。從外觀上看,BruceLowe的答案應該可以做你想做的事,也許代碼可以幫助消除誤解。 – 2012-04-17 20:13:41

回答

10

隨着json.org library for Java,你只能先獲取父JSONObject情況下獲得一個物體的各個屬性:

JSONObject object = new JSONObject(json); 
JSONObject location = object.getJSONObject("location"); 
double lng = location.getDouble("lng"); 
double lat = location.getDouble("lat"); 

如果您使用「點號」,試圖訪問屬性,像這樣:

JSONObject object = new JSONObject(json); 
double lng = object.getDouble("location.lng"); 
double lat = object.getDouble("location.lat"); 

那麼json.org庫不是你要找的:它不支持這種訪問。


作爲附帶節點,它是沒有意義在你的問題中給出的JSON的任何部分調用getString("location")。被稱爲「location」的唯一屬性的值是具有兩個名爲「lng」和「lat」的屬性的另一個對象。

如果你想這個「作爲一個字符串」,最接近的就是調用toString()JSONObject location(在這個答案第一個代碼段),這將給你喜歡的東西{"lng":-78.922026,"lat":36.0083185}

+1

我剛從您的複製JSON字符串問題並將其粘貼到Eclipse中的本地String變量中 - 如果'object.getJSONObject(「location」);'爲您拋出異常,我懷疑JSON可能與您的問題中的內容不同。 – 2012-04-17 20:53:04

+0

我明白你想調用'object.getString(「location」)''的原因 - 這不是json.org庫的工作原理/定義。 'getString()'「獲取[s]與鍵關聯的字符串」或者如果沒有鍵的字符串值,則拋出JSONException「。 - 關鍵字「位置」沒有字符串值,只有對象值。 – 2012-04-17 20:54:49

+0

這並沒有什麼不同,我只是從system.out直接在jsonlint.org上驗證它。我將嘗試重新加載我的庫並清理項目,我猜測它可能是eclipse和我的工作空間,因爲每個人都會按照我的嘗試推薦相同的調用。感謝您的幫助,但我很感激。 – 2012-04-17 20:55:19

4

我相信你需要使用jsonObjectVariable.getJSONObject(「location」),然後返回另一個JSONObject。

然後,您可以在該對象上調用getDouble(「lng」)或getDouble(「lat」)。

E.g.

double lat = jsonObjectVariable.getJSONObject("location").getDouble("lat"); 
+0

這不起作用,我試着它就像它在問題中說的;)我評估成一個JSONObject,但是當我在「位置」調用getString函數時,它不返回「拉特」的字符串:derpderp等。我知道有一種訪問這個對象子域的方法,我會繼續嘗試。我試過掃描儀並拉下掃描。nextDouble,但我仍然無法獲取「位置」下的項目字符串或數字的兩倍。 – 2012-04-17 20:06:38

+0

考慮到問題中的JSON,'String lat = ... getString(「lat」)'應該是'double lat = ... getDouble(「lat」)'。 – 2012-04-17 20:15:40

+0

我剛纔說我試圖掃描出一個double,我試圖拉「位置」,它應該格式化爲一個字符串。 – 2012-04-17 20:21:40

-1

您可以擴展的JSONObject類並覆蓋public Object get(String key) throws JSONException有以下幾點:

public Object get(String key) throws JSONException { 
    if (key == null) { 
     throw new JSONException("Null key."); 
    } 

    Object object = this.opt(key); 
    if (object == null) { 
     if(key.contains(".")){ 
      object = this.getWithDotNotation(key); 
     } 
     else 
      throw new JSONException("JSONObject[" + quote(key) + "] not found."); 
    } 
    return object; 
} 


private Object getWithDotNotation(String key) throws JSONException { 
    if(key.contains(".")){ 
     int indexOfDot = key.indexOf("."); 
     String subKey = key.substring(0, indexOfDot); 
     JSONObject jsonObject = (JSONObject)this.get(subKey); 
     if(jsonObject == null){ 
      throw new JSONException(subKey + " is null"); 
     } 
     try{ 
      return jsonObject.getWithDotNotation(key.substring(indexOfDot + 1));     
     }catch(JSONException e){ 
      throw new JSONException(subKey + "." + e.getMessage()); 
     } 
    } 
    else 
     return this.get(key); 
} 

請隨時以更好地處理異常..我敢肯定它不是正確的處理。 謝謝

0

您應該創建類位置拉「位置」子字段。

public class Location { 
    private double lat; 
    private double lng; 

@JsonCreator 
    public Location(@JsonProperty("lat") double lat, @JsonProperty("lng") double lng { 
     this.lat = lat; 
     this.lngenter code here = lng; 
    }