2011-11-22 133 views
32
{ 
    "Response": { 
     "MetaInfo": { 
      "Timestamp": "2011-11-21T14:55:06.556Z" 
     }, 
     "View": [ 
      { 
       "_type": "SearchResultsViewType", 
       "ViewId": 0, 
       "Result": [ 
        { 
         "Relevance": 0.56, 
         "MatchQuality": { 
          "Country": 1, 
          "State": 1, 
          "County": 1, 
          "City": 1, 
          "PostalCode": 1 
         }, 
         "Location": { 
          "LocationType": "point", 
          "DisplayPosition": { 
           "Latitude": 50.1105, 
           "Longitude": 8.684 
          }, 
          "MapView": { 
           "_type": "GeoBoundingBoxType", 
           "TopLeft": { 
            "Latitude": 50.1194932, 
            "Longitude": 8.6699768 
           }, 
           "BottomRight": { 
            "Latitude": 50.1015068, 
            "Longitude": 8.6980232 
           } 
          }, 
          "Address": { 
           "Country": "DEU", 
           "State": "Hessen", 
           "County": "Frankfurt am Main", 
           "City": "Frankfurt am Main", 
           "District": "Frankfurt am Main", 
           "PostalCode": "60311", 
           "AdditionalData": [ 
            { 
             "value": "Germany", 
             "key": "CountryName" 
            } 
           ] 
          } 
         } 
        } 
       ] 
      } 
     ] 
    } 
} 

我想從上面的JSON檢索郵政編碼。我正在使用gson來解析它。我對JSON非常陌生,從我從這裏發佈的所有帖子(有些與此非常相似)中讀到的內容中,我瞭解到字段名稱應該保持原樣。所以我明白我必須做出4個課,即迴應,觀看,結果和地址。我讓它們成爲靜態嵌套類,但是我只獲得空值作爲輸出。在下一個JSON中,我有多個地址。但是我被困在這個單一的迴應中。使用gson解析嵌套的JSON

對於一個簡單的例子,我嘗試使用此代碼檢索時間戳,但它給了我一個空值

public class ParseJSON { 
    public static void main(String[] args) throws Exception { 
     BufferedReader br = new BufferedReader(new FileReader("try.json")); 

     Gson gson = new GsonBuilder().create(); 
     Pojo pojo = gson.fromJson(br,Pojo.class); 
     System.out.println(Pojo.Response.MetaInfo.Timestamp); 
     br.close(); 
    } 
} 

class Pojo { 
    public Pojo() { } 

    static class Response{ 
     static class MetaInfo { 
      static public String Timestamp; 

      public String getTimestamp() { 
        return Timestamp; 
      } 
     } 
    } 
} 
+0

如果有人能幫助我,我會感激不盡。 – RFT

回答

42

如果你只需要"PostalCode",你可以使用JsonParser而不是有一堆類:

JsonParser jsonParser = new JsonParser(); 
JsonObject address = jsonParser.parse(json) 
    .getAsJsonObject().get("Response") 
    .getAsJsonObject().getAsJsonArray("View").get(0) 
    .getAsJsonObject().getAsJsonArray("Result").get(0) 
    .getAsJsonObject().get("Location") 
    .getAsJsonObject().getAsJsonObject("Address"); 
String postalCode = address.get("PostalCode").getAsString(); 

或所有結果:

JsonArray results = jsonParser.parse(json) 
     .getAsJsonObject().get("Response") 
     .getAsJsonObject().getAsJsonArray("View").get(0) 
     .getAsJsonObject().getAsJsonArray("Result"); 
for (JsonElement result : results) { 
    JsonObject address = result.getAsJsonObject().get("Location").getAsJsonObject().getAsJsonObject("Address"); 
    String postalCode = address.get("PostalCode").getAsString(); 
    System.out.println(postalCode); 
} 
+0

感謝它的工作。另外,我很好奇,這也適用於多個地址,對不對? – RFT

+0

@sid:太好了。你的意思是多重結果?你可以迭代getAsJsonArray(「Result」)這就是你的意思。 – jeha

+0

是的,我有包含地址的數組的項目,我需要所有地址的郵政編碼。通過迭代getAsJsonArray(「Result」),我完全不明白你的意思。 – RFT

10

要使您的時間戳示例工作,請嘗試:

public class ParseJSON { 
    public static void main(String[] args) throws Exception { 
     BufferedReader br = new BufferedReader(new FileReader("try.json")); 

     Gson gson = new GsonBuilder().create(); 
     Pojo pojo = gson.fromJson(br, Pojo.class); 

     System.out.println(pojo.Response.MetaInfo.Timestamp); 
     br.close(); 
    } 
} 

class Pojo { 
    Response Response = new Response(); 
} 

class Response { 
    MetaInfo MetaInfo = new MetaInfo(); 
} 

class MetaInfo { 
    String Timestamp; 
} 
+0

我以前試過類似的東西,它仍然顯示爲空! – RFT

+1

@sid:你做了'Pojo ...'而不是'pojo ...' - 請試試這個 - 它適用於我,也適合你:) – jeha

+1

這是最適合問題的答案。 –