2011-11-22 21 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" 
            } 
           ] 
          } 
         } 
        } 
       ] 
      } 
     ] 
    } 
} 

Estoy tratando de recuperar el código postal del JSON anterior. Estoy usando gson para analizarlo. Soy muy nuevo en JSON y por lo que he leído en todas las publicaciones aquí (algunas muy similares a esto), entendí que el nombre de los campos debería ser como es. Así que entiendo que tengo que hacer 4 clases a saber Respuesta, vista, Resultado y Dirección. Las convertí en clases anidadas estáticas, pero solo obtengo valor nulo como resultado. En el próximo JSON, tengo varias direcciones. Pero estoy atascado en esta única respuesta.Analizar un JSON anidado usando gson

Durante un breve ejemplo, trato de recuperar Marca de tiempo con este código, pero me da un valor nulo

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

estoy luchando con esto, si alguien me puede ayudar se lo agradecerán. – RFT

Respuesta

42

Si sólo necesita la "PostalCode", podría utilizar JsonParser en lugar de tener un montón de clases :

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(); 

o para todos los resultados:

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

Gracias funcionó. Además, tenía curiosidad, esto debería funcionar para múltiples direcciones también, ¿no? – RFT

+0

@sid: Genial. ¿Quieres decir resultados múltiples? Puede iterar sobre 'getAsJsonArray (" Result ")' eso es lo que quiere decir. – jeha

+0

sí, tengo elementos que son matrices que contienen direcciones y necesito el código postal de todas las direcciones. No entendí exactamente a qué se refiere al iterar sobre getAsJsonArray ("Resultado"). – RFT

10

Para que su ejemplo de trabajo de marca de hora, trato:

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

¡Intenté algo similar antes, todavía muestra nulo! – RFT

+1

@sid: hiciste 'Pojo ...' no 'pojo ...' - por favor prueba este - me funciona y debería para ti también – jeha

+1

Esta es la respuesta más adecuada para la pregunta que la otra. –

Cuestiones relacionadas