2012-09-15 27 views
7

tengo el siguiente JSON:de análisis anidado JSON

{ 
    "registration": { 
    "name": "Vik Kumar", 
    "first_name": "Vik", 
    "last_name": "Kumar", 
    "bloodGroup": "B-", 
    "gender": "male", 
    "birthday": "10\/31\/1983", 
    "email": "vik.ceo\u0040gmail.com", 
    "cellPhone": "1234123456", 
    "homePhone": "1234123457", 
    "officePhone": "1234123458", 
    "primaryAddress": "jdfjfgj", 
    "area": "jfdjdfj", 
    "location": { 
     "name": "Redwood Shores, California", 
     "id": 103107903062719 
    }, 
    "subscribe": true, 
    "eyePledge": false, 
    "reference": "fgfgfgfg" 
    } 
} 

Estoy utilizando el código siguiente para analizarlo:

JsonNode json = new ObjectMapper().readTree(jsonString); 
JsonNode registration_fields = json.get("registration"); 

Iterator<String> fieldNames = registration_fields.getFieldNames(); 
while(fieldNames.hasNext()){ 
    String fieldName = fieldNames.next(); 
    String fieldValue = registration_fields.get(fieldName).asText(); 
    System.out.println(fieldName+" : "+fieldValue); 
} 

Esto funciona bien y es imprimir todos los valores a excepción de ubicación, que está tipo de otro nivel de anidación. Probé el mismo truco que el código anterior para pasar json.get ("ubicación") pero eso no funciona. Sugiera cómo hacer que funcione para la ubicación.

+0

¿Qué quiere decir con "no funciona", aparece un mensaje de error? Si es así, ¿qué dice? –

+1

Para que quede claro, el código anterior funciona bien. pero cuando intento aplicar la misma lógica para el campo de ubicación, la línea location_fields.getFieldNames() arroja una excepción de puntero nulo. Estoy seguro de que estoy pasando el nombre correcto "ubicación" en la primera línea – Vik

Respuesta

15

necesita detectar cuando se trata de un (anidada) Object usando JsonNode#isObject:

public static void printAll(JsonNode node) { 
    Iterator<String> fieldNames = node.getFieldNames(); 
    while(fieldNames.hasNext()){ 
     String fieldName = fieldNames.next(); 
     JsonNode fieldValue = node.get(fieldName); 
     if (fieldValue.isObject()) { 
      System.out.println(fieldName + " :"); 
      printAll(fieldValue); 
     } else { 
      String value = fieldValue.asText(); 
      System.out.println(fieldName + " : " + value); 
     } 
    } 
} 

Por lo tanto, cuando se llega a un objeto, como location, se le llama a la printAll de forma recursiva para imprimir todas las es valores internos.

org.codehaus.jackson.JsonNode json = new ObjectMapper().readTree(jsonString); 
org.codehaus.jackson.JsonNode registration_fields = json.get("registration"); 
printAll(registration_fields); 
+1

Tx se ve bien probando. – Vik

+1

node.getFieldNames() no está disponible. Use node.fieldNames() en su lugar? –

+0

Gracias por mostrar el paquete. –

1

Desde location está anidado dentro registration, es necesario utilizar:

registration_fields.get("location"); 

conseguirlo. Pero, ¿no está ya procesado por el while-loop, por qué necesita obtenerlo por separado?

+2

Quiere imprimir los contenidos de 'ubicación'. Como es un objeto, su valor * text * estará vacío. –

+0

bien cierto, pero en ese caso, ¿cómo consigo esos valores? la línea de código actual String fieldValue = registration_fields.get (fieldName) .asText() imprime en blanco – Vik

+0

Consulte la respuesta de João Silva. – Barmar