2012-09-15 14 views
7

Ho la seguente JSON:Analisi annidato 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" 
    } 
} 

Sto usando il seguente codice di analizzarlo:

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

Questo funziona bene e stampare tutti i valori ad eccezione di posizione che è tipo di un altro livello di nidificazione. Ho provato lo stesso trucco del codice precedente per passare a json.get ("location") ma non funziona. Si prega di suggerire come farlo funzionare per la posizione.

+0

Cosa intendi per "non funziona", ricevi un messaggio di errore? Se sì, cosa dice? –

+1

Giusto per essere chiari, il codice sopra funziona perfettamente. ma quando provo ad applicare la stessa logica per il campo posizione, la riga location_fields.getFieldNames() genera un'eccezione del puntatore nullo. Sono sicuro che sto passando il nome giusto "posizione" sulla prima riga – Vik

risposta

15

È necessario rilevare quando si tratta di un (nidificato) Object utilizzando 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); 
     } 
    } 
} 

Così, quando si raggiunge un oggetto, come ad esempio location, si chiama la printAll in modo ricorsivo per stampare tutti i i suoi valori interni.

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

Tx sembra bello provare. – Vik

+1

node.getFieldNames() non è disponibile. Utilizzare invece node.fieldNames()? –

+0

Grazie per aver mostrato il pacchetto. –

1

Dal location è nidificato all'interno registration, è necessario utilizzare:

registration_fields.get("location"); 

per ottenerlo. Ma non è già elaborato dal ciclo while, perché è necessario ottenerlo separatamente?

+2

Vuole stampare il contenuto di 'location'. Poiché si tratta di un oggetto, il suo valore * text * sarà vuoto. –

+0

vero ma in tal caso come faccio a ottenere quei valori? la stringa di codice corrente String fieldValue = registration_fields.get (fieldName) .asText() stampa blank – Vik

+0

Vedi la risposta di João Silva. – Barmar