2012-09-15 26 views
7

Ich habe folgende JSON:Parsing verschachtelt 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" 
    } 
} 

ich den folgenden Code verwenden es zu analysieren:

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

Dies funktioniert gut und es alle Werte mit Ausnahme der Stelle drucken, die ist Art von einer anderen Ebene der Verschachtelung. Ich habe den gleichen Trick wie oben beschrieben, um json.get ("location") zu übergeben, aber das funktioniert nicht. Bitte schlagen Sie vor, wie es für den Standort funktioniert.

+0

Was meinen Sie mit "funktioniert nicht", erhalten Sie eine Fehlermeldung? Wenn ja, was sagt es? –

+1

Nur um klar zu sein, funktioniert der obige Code gut. aber wenn ich versuche, die gleiche Logik für Standortfeld anzuwenden, dann löst die Zeile location_fields.getFieldNames() eine Nullzeigerausnahme aus. Ich bin sicher, dass ich den richtigen Namen "Standort" in der ersten Zeile übergebe – Vik

Antwort

15

Sie müssen erkennen, wenn Sie mit einem (verschachtelte) handelt Object mit 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); 
     } 
    } 
} 

Wenn Sie also ein Objekt, wie location erreichen, werden Sie die printAll rekursiv rufen alle drucken seine inneren Werte.

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

Tx sieht gut aus. – Vik

+1

node.getFieldNames() ist nicht verfügbar. Benutze stattdessen node.fieldNames()? –

+0

Danke für das Zeigen des Pakets. –

1

Da location innerhalb registration verschachtelt ist, müssen Sie verwenden:

registration_fields.get("location"); 

es zu bekommen. Aber ist es nicht bereits von der While-Schleife verarbeitet, warum müssen Sie es separat bekommen?

+2

Er möchte den Inhalt von 'location' drucken. Da es ein Objekt ist, ist sein * text * -Wert leer. –

+0

gut wahr, aber in diesem Fall, wie bekomme ich diese Werte? die aktuelle Codezeile String fieldValue = registration_fields.get (fieldName) .asText() druckt leer – Vik

+0

Siehe João Silvas Antwort. – Barmar