2012-09-15 32 views
7

iç içe Aşağıdaki JSON var: Ben ayrıştırmak için aşağıdaki kodu kullanıyorumAyrıştırma 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" 
    } 
} 

:

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

Bu iyi çalışır ve o konumu haricinde tüm değerleri yazdırmak başka bir yuvalanma seviyesi. Ben json.get ("konum") geçmek için yukarıdaki kodu aynı hile çalıştı ama bu çalışmaz. Lütfen konum için nasıl çalışacağınızı önerin.

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

Böylece, bir nesne ulaştığında, böyle location olarak, özyinelemeli printAll arayacağım tüm yazdırmak için:

+0

"Çalışmıyor" ile ne demek istiyorsun, bir hata mesajı alıyor musunuz? Eğer öyleyse, ne diyor? –

+1

Sadece açık olmak için yukarıdaki kod düzgün çalışıyor. ama konum alanı için aynı mantığı uygulamaya çalıştığımda, o zaman location_fields.getFieldNames() satırı, boş gösterici istisnası atar. Eminim ilk satırdaki "konum" doğru ismini geçiyorum eminim – Vik

cevap

15

Sen bir (iç içe) ile uğraşırken JsonNode#isObject kullanılarak Object algılamak gerekir değerleri. location yana

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

Tx denemek güzel görünüyor. – Vik

+1

node.getFieldNames() kullanılamıyor. Bunun yerine node.fieldNames() kullanın? –

+0

Paketi gösterdiğiniz için teşekkür ederiz. –

1

registration içinde yuvalanmış, kullanmak gerekir:

registration_fields.get("location"); 

almak için. Ama o zaten while-loop tarafından işlenmemiş, neden ayrı olarak almanız gerekiyor?

+2

"Konum" içeriğini yazdırmak istiyor. Bir nesne olduğu için, * text * değeri boş olacaktır. –

+0

iyi ama bu durumda bu değerleri nasıl alabilirim? Geçerli kod satırı Dize fieldValue = registration_fields.get (fieldName) .asText() boş yazdırır – Vik

+0

Bkz. João Silva yanıtı. – Barmar