Java 解析嵌套JSON
我有以下JSON:Java 解析嵌套JSON,java,json,jackson,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": "1234123
{
"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);
}
JsonNode json=newObjectMapper().readTree(jsonString);
JsonNode registration_fields=json.get(“注册”);
迭代器fieldNames=注册_fields.getFieldNames();
while(fieldNames.hasNext()){
字符串fieldName=fieldNames.next();
String fieldValue=registration_fields.get(fieldName.asText();
System.out.println(fieldName+“:”+fieldValue);
}
这可以很好地工作,它可以打印除位置以外的所有值,位置是另一种嵌套级别。我尝试了与上面代码相同的技巧来传递json.get(“location”),但这不起作用。请建议如何使其适用于位置。当您使用
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);
}
}
}
由于位置
嵌套在注册
中,因此需要使用:
registration_fields.get("location");
去拿。但是while循环是否已经处理了它,为什么需要单独获取它呢?您所说的“不工作”是什么意思,是否收到错误消息?如果是这样的话,它会说什么?只是为了澄清一下,上面的代码工作得很好。但当我尝试对location字段应用相同的逻辑时,行location_fields.getFieldNames()抛出空指针异常。我确信我在第一行传递了正确的名称“location”。他想打印location
的内容。因为它是一个对象,所以它的文本值将为空。是的,但在这种情况下,我如何获得这些值?当前代码行字符串fieldValue=registration\u fields.get(fieldName).asText()打印blanknode。getFieldNames()不可用。是否改为使用node.fieldNames()?
registration_fields.get("location");