介绍Jackson JsonNode和ObjectNode(*)

介绍Jackson JsonNode和ObjectNode

Jackson JsonNode类,完整路径为com.fasterxml.jackson.databind.JsonNode,是Jackson的json树模型(对象图模型)。Jackson能读JSON至JsonNode实例,写JsonNode到JSON。本文不涉及json序列化或反序列化,主要介绍如何从头构建JsonNode对象图,之后你可以序列化为json。

json字符串转JsonNode对象。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取出对应的值!

5.代码示例

JsonNode jsonNode= JacksonUtil.toJsonNode("{}");
((ObjectNode) jsonNode).put("name", "chen");
((ObjectNode) jsonNode).put("age", 25);

6.补充

Json是一种数据格式。
Jackson是处理和解析Json数据格式的第三方库。
JsonNode对象是Jackson的json树模型(对象图模型)。Jackson能读JSON字符串至JsonNode实例,写JsonNode到JSON字符串。
JsonNode对象是不可变的。
ObjectNode是JsonNode的子类,其对象是可变的。可用于构建json树模型。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值