介绍Jackson JsonNode和ObjectNode

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了介绍Jackson JsonNode和ObjectNode相关的知识,希望对你有一定的参考价值。

介绍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对象图。

jsonNode是Jackson的json树模型(对象图模型)。Jackson能读JSON至JsonNode实例,写JsonNode到JSON。
json是一个字符串,jsonNode是一个对象!
可以将json转换成jsonNode,jsonNode中都是键值对形式,可以根据Key取出对应的值!

以上是关于介绍Jackson JsonNode和ObjectNode的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 中的 ObjectNode 和 JsonNode 有啥区别?

深入了解 Jackson 之 JsonNode

Jackson Json:如何将数组转换为 JsonNode 和 ObjectNode?

使用Jackson – 将字符串转换为 JsonNode 对象

如何将 JSON 字符串解析为 Jackson 中的 JsonNode?

Neo4j 和 Spring-data Map 查询结果到 Jackson JsonNode