zoukankan      html  css  js  c++  java
  • 介绍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());
    1
    2
    3
    4
    5
    6
    7
    实际项目中ObjectMapper不应每次都创建,比如从spring容器中注入。

    2.2. 写JsonNode至json
    使用Jackson写JsonNode至json,也需要ObjectMapper对象。调用writeValueAsString()方法,或其他适合你的写方法(writeValue),请看示例:

    ObjectMapper objectMapper = new ObjectMapper();

    JsonNode jsonNode = readJsonIntoJsonNode();

    String json = objectMapper.writeValueAsString(jsonNode);
    1
    2
    3
    4
    5
    readJsonIntoJsonNode()方法是我创建用于解析json字符串值JsonNode的方法,为了生成JsonNode去写。该方法抽取内容在本例中不是重点,你仅需了解产生了一个JsonNode对象。重要的是调用了ObjectWriter的writeValueAsString()方法将JsonNode写入JSON字符串。ObjectMapper提供了很多写方法,用于不同目的写操作,读者可以查看相应文档或源码。

    2.3. 获取JsonNode 字段
    和json对象一样,JsonNode可以多个字段。假设我们解析下面json值JsonNode:

    {
    "field1" : "value1",
    "field2" : 999
    }
    1
    2
    3
    4
    json有两个字段,如果你用jsonNode表示上面json对象,则可以获得其两个字段:

    JsonNode jsonNode = ... //parse above JSON into a JsonNode

    JsonNode field1 = jsonNode.get("field1");
    JsonNode field2 = jsonNode.get("field2");
    1
    2
    3
    4
    注意,即使两个字段是字符串类型,但get方法总是返回JsonNode类型表示字段。

    2.4. 使用at方法获取JsonNode字段
    Jackson JsonNode有个特殊方法是at()方法。at方法可以在给定JsonNode作为根节点Json对象图中访问任何字段。
    示例如下:

    {
    "identification" : {
    "name" : "James",
    "ssn: "ABC123552"
    }
    }
    1
    2
    3
    4
    5
    6
    如果该json对应的JsonNode可以通过at方法访问其name字段:

    JsonNode nameNode = jsonNode.at("/identification/name");
    1
    注意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();
    1
    2
    3
    4
    如果f2字段包含值为123456,则其有可能呗转换为字符串,double,int,long类型。

    3. 操作ObjectNode
    前面提到,JsonNode是不可变的。为了创建JsonNode对象图,你需要改变图中的JsonNode实例,如设置属性值和子JsonNode实例。因为其不可变性,不能直接进行操作,替代的是其子类ObjectNode,下面详细进行说明。

    3.1. 设置ObjectNode属性
    首先创建ObjectNode实例:

    ObjectMapper objectMapper = new ObjectMapper();

    ObjectNode objectNode = objectMapper.createObjectNode();
    1
    2
    3
    为了设置ObjectNode对象属性,需要调用set方法。传入字段名和JsonNode作为参数。

    ObjectMapper objectMapper = new ObjectMapper();
    ObjectNode parentNode = objectMapper.createObjectNode();

    JsonNode childNode = readJsonIntoJsonNode();

    parentNode.set("child1", childNode);
    1
    2
    3
    4
    5
    6
    readJsonIntoJsonNode() 方法负责生产一些JsonNode对象,我们准备作为ObjectNode的子节点。

    3.2. 设置ObjectNode属性值为原始数据类型值
    ObjectNode类也提供一组方法用于设置属性值为原始数据类型。相对于转换原始值为JsonNode再进行设置要简单。请看示例:

    objectNode.put("field1", "value1");
    objectNode.put("field2", 123);
    objectNode.put("field3", 999.999);
    1
    2
    3
    4. 总结
    本文介绍了Jackson的JsonNode和ObjectNode两个类,前者是不可变的,一般用于读取。后者可变,一般用于创建Json对象图。
    ————————————————
    版权声明:本文为CSDN博主「neweastsun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/neweastsun/article/details/100669516

  • 相关阅读:
    僵尸进程
    理论整理
    SQLServer相关概念
    存储过程
    我的简书地址
    swift pragma mark
    苹果iOS开发中如何直接跳转到App Store页面
    使用cocoadPod updating local specs repositories 卡主
    iOS 代码格式化插件Clang-Format
    iOS错误:AFNetworking Error Domain=NSURLErrorDomain Code=-999
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/14528502.html
Copyright © 2011-2022 走看看