介绍Jackson JsonNode和ObjectNode
Jackson JsonNode类,完整路径为com.fasterxml.jackson.databind.JsonNode,是Jackson的json树模型(对象图模型)。Jackson能读JSON至JsonNode实例,写JsonNode到JSON。本文不涉及json序列化或反序列化,主要介绍如何从头构建JsonNode对象图,之后你可以序列化为json。
1. JsonNode vs. ObjectNode
The Jackson JsonNode对象不可变,这意味着不能直接构建JsonNode实例的对象图,但你可以创建JsonNode 的子类ObjectNode实例的对象图。作为JsonNode 的子类,ObjectNode可以在任何使用了JsonNode之处使用。后面你会看到如何构建ObjectNode对象图。
2. 操作JsonNode
2.1. 从json中读JsonNode
为了使用Jackson读json为JsonNode,需要创建Jackson ObjectMapper 实例。然后调用其readTree()方法,使用源json作为参数,请看示例:
String json = "{ \"f1\" : \"v1\" } ";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(json);
System.out.println(jsonNode.get("f1").asText());
实际项目中ObjectMapper不应每次都创建,比如从spring容器中注入。
2.2. 写JsonNode至json
使用Jackson写JsonNode至json,也需要ObjectMapper对象。调用writeValueAsString()方法,或其他适合你的写方法(writeValue),请看示例:
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = readJsonIntoJsonNode();
String json = objectMapper.writeValueAsString(jsonNode);
readJsonIntoJsonNode()方法是我创建用于解析json字符串值JsonNode的方法,为了生成JsonNode去写。该方法抽取内容在本例中不是重点,你仅需了解产生了一个JsonNode对象。重要的是调用了ObjectWriter的writeValueAsString()方法将JsonNode写入JSON字符串。ObjectMapper提供了很多写方法,用于不同目的写操作,读者可以查看相应文档或源码。
2.3. 获取JsonNode 字段
和json对象一样,JsonNode可以多个字段。假设我们解析下面json值JsonNode:
{
"field1" : "value1",
"field2" : 999
}
json有两个字段,如果你用jsonNode表示上面json对象,则可以获得其两个字段:
JsonNode jsonNode = ... //parse above JSON into a JsonNode
JsonNode field1 = jsonNode.get("field1");
JsonNode field2 = jsonNode.get("field2");
注意,即使两个字段是字符串类型,但get方法总是返回JsonNode类型表示字段。
2.4. 使用at方法获取JsonNode字段
Jackson JsonNode有个特殊方法是at()方法。at方法可以在给定JsonNode作为根节点Json对象图中访问任何字段。
示例如下:
{
"identification" : {
"name" : "James",
"ssn: "ABC123552"
}
}
如果该json对应的JsonNode可以通过at方法访问其name字段:
JsonNode nameNode = jsonNode.at("/identification/name");
注意at方法的参数:字符串"/identification/name",这是json路径表达式。路径表达式指定了完整的从JsonNode的根到要访问字段的路径,与文件系统的路径很相似。但需要提醒的是必须以/开头。
at方法返回要访问的字段的JsonNode,如果没有找到则返回null。为了获得字段的实际值,需要调用其他方法进行转换,下面部分开始讲解。
2.5. 转换JsonNode字段
Jackson JsonNode类提供一组方法可以转换字段值至其他数据类型。如long、字符串等。请看示例:
String f2Str = jsonNode.get("f2").asText();
double f2Dbl = jsonNode.get("f2").asDouble();
int f2Int = jsonNode.get("f2").asInt();
long f2Lng = jsonNode.get("f2").asLong();
如果f2字段包含值为123456,则其有可能呗转换为字符串,double,int,long类型。
3. 操作ObjectNode
前面提到,JsonNode是不可变的。为了创建JsonNode对象图,你需要改变图中的JsonNode实例,如设置属性值和子JsonNode实例。因为其不可变性,不能直接进行操作,替代的是其子类ObjectNode,下面详细进行说明。
3.1. 设置ObjectNode属性
首先创建ObjectNode实例:
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode();
为了设置ObjectNode对象属性,需要调用set方法。传入字段名和JsonNode作为参数。
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode parentNode = objectMapper.createObjectNode();
JsonNode childNode = readJsonIntoJsonNode();
parentNode.set("child1", childNode);
readJsonIntoJsonNode() 方法负责生产一些JsonNode对象,我们准备作为ObjectNode的子节点。
3.2. 设置ObjectNode属性值为原始数据类型值
ObjectNode类也提供一组方法用于设置属性值为原始数据类型。相对于转换原始值为JsonNode再进行设置要简单。请看示例:
objectNode.put("field1", "value1");
objectNode.put("field2", 123);
objectNode.put("field3", 999.999);
4. 总结
本文介绍了Jackson的JsonNode和ObjectNode两个类,前者是不可变的,一般用于读取。后者可变,一般用于创建Json对象图。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/100669516