解析嵌套的JSON

Vik*_*Vik 7 java json jackson

我有以下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"
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来解析它:

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);
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,它打印除了位置的所有值,这是另一层嵌套.我尝试了与上面的代码相同的技巧来传递json.get("location"),但这不起作用.请建议如何使其适用于位置.

Joã*_*lva 15

您需要检测何时处理(嵌套)Object使用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);
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

因此,当您到达某个对象时,例如location,您将以printAll递归方式调用它以打印其所有内部值.

org.codehaus.jackson.JsonNode json = new ObjectMapper().readTree(jsonString);
org.codehaus.jackson.JsonNode registration_fields = json.get("registration");
printAll(registration_fields);
Run Code Online (Sandbox Code Playgroud)

  • node.getFieldNames()不可用.使用node.fieldNames()代替? (2认同)