2011-11-22 26 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つのクラス、レスポンス、ビュー、結果、アドレスを作る必要があることを理解しています。私はそれらに静的なネストされたクラスを作ったが、出力としてnull値しか得ていない。次のJSONでは、私は複数のアドレスを持っています。しかし、私はこの単一の応答に立ち往生しています。gsonを使用して入れ子になったJSONを解析する

短い例えば、私はこのコードでタイムスタンプを取得しようとしていますが、唯一の"PostalCode"が必要な場合、それは私にNULL値

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

を与え、あなたはクラスの束を持つのではなく、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( "結果")を反復することによって何を意味するのかは分かりませんでした。 – 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

私は以前同様のことを試みました、それでもnullを表示します! – RFT

+1

@sid:あなたは 'Pojo ...'ではなく 'pojo ...'ではありません - これを試してみてください - それは私にとってはうまくいくはずです。 – jeha

+1

これは他の質問よりも最も適切な答えです。 –

関連する問題