2012-09-15 28 views
7

Tôi có JSON sau:Parsing lồng 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" 
    } 
} 

Tôi đang sử dụng đoạn mã sau để phân tích nó:

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

này hoạt động tốt và nó in tất cả các giá trị ngoại trừ vị trí đó là loại cấp độ làm tổ khác. Tôi đã thử cùng một thủ thuật như trên mã để vượt qua json.get ("vị trí") nhưng điều đó không hoạt động. Vui lòng đề xuất cách làm cho nó hoạt động cho vị trí.

+0

Bạn có ý nghĩa gì bởi "không hoạt động", bạn có nhận được thông báo lỗi không? Nếu vậy, nó nói gì? –

+1

Chỉ cần rõ ràng mã trên hoạt động tốt. nhưng khi tôi cố gắng áp dụng cùng một logic cho trường vị trí thì dòng location_fields.getFieldNames() ném ra ngoại lệ con trỏ null. Tôi chắc chắn tôi đang đi đúng tên "vị trí" trên dòng đầu tiên – Vik

Trả lời

15

Bạn cần phải phát hiện khi bạn đang đối phó với một (lồng) Object sử dụng 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); 
     } 
    } 
} 

Vì vậy, khi bạn đạt đến một đối tượng, chẳng hạn như location, bạn sẽ gọi printAll đệ quy để in tất cả các giá trị bên trong của nó.

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

Tx có vẻ cố gắng tốt. – Vik

+1

node.getFieldNames() không khả dụng. Sử dụng node.fieldNames() để thay thế? –

+0

Cảm ơn bạn đã hiển thị gói. –

1

Kể từ location được lồng trong registration, bạn cần sử dụng:

registration_fields.get("location"); 

để có được nó. Nhưng không phải nó đã được xử lý bởi vòng lặp while, tại sao bạn cần phải làm cho nó một cách riêng biệt?

+2

Anh ấy muốn in nội dung của 'vị trí'. Vì nó là một đối tượng, giá trị * text * của nó sẽ trống. –

+0

cũng đúng nhưng trong trường hợp đó làm thế nào để tôi có được những giá trị đó? dòng mã hiện tại String fieldValue = registration_fields.get (fieldName) .asText() in trống – Vik

+0

Xem câu trả lời của João Silva. – Barmar