2012-09-15 287 views
7

我有以下的JSON:解析嵌套的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); 
} 

這工作得很好,並打印除了位置是所有的值另一種嵌套層次。我嘗試了與上面的代碼相同的技巧來傳遞json.get(「location」),但這不起作用。請建議如何使它適用於位置。

+0

你是什麼意思的「不起作用」,你會得到一個錯誤信息?如果是這樣,它說什麼? –

+1

只是爲了清楚上面的代碼工作正常。但是當我嘗試應用位置字段相同的邏輯,然後行location_fields.getFieldNames()引發空指針異常。我相信我通過第一行 – Vik

回答

15

您需要使用JsonNode#isObject當你正在處理一個(嵌套)來檢測Object

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

因此,當你到達一個對象,如location,你會叫printAll遞歸打印所有其內部值。

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

Tx正確的名稱「位置」Tx看起來不錯。 – Vik

+1

node.getFieldNames()不可用。使用node.fieldNames()來代替? –

+0

感謝您的包裝。 –

1

由於location嵌套在registration,你需要使用:

registration_fields.get("location"); 

得到它。但是它不是已經被while循環處理了,爲什麼你需要單獨獲取它?

+2

他想打印「位置」的內容。由於它是一個對象,它的* text *值將是空的。 –

+0

很好,但在那種情況下,我該如何獲得這些值?當前的代碼行String fieldValue = registration_fields.get(fieldName).asText()打印空白 – Vik

+0

請參閱JoãoSilva的回答。 – Barmar