Skip to main content
 首页 » 编程设计

介绍Jackson JsonNode和ObjectNode

2022年07月19日39shangdawei

介绍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