Java ObjectMapper get() path()方法的区别

在项目中有一个需求需要读取Json数据中固定key的值,这里使用到了ObjectMapper。但是在使用过程中发现get()、path()方法都可以读取Json数据,但是实际上两者是有些区别的。

话不多说,上码

public static void main(String[] args) {
        String result = "{\"code\":0,\"message\":\"成功\",\"data\":{\"fileUrl\":\"https://www.baidu.com\",\"fileVersionName\":\"v0.0.1\"}}";

        ObjectMapper objectMapper = new ObjectMapper();

        try {
            // JSON字符串转JSONNode对象
            JsonNode resultJsonNode = objectMapper.readTree(result);
            System.out.println(resultJsonNode);

            JsonNode dataNode = resultJsonNode.get("data");
            System.out.println(dataNode);

			/**
             * path: 此方法类似于get(String),不同之处在于,如果不存在这样的值(由于此节点不是对象,或者对象没有指定字段的值),
             * 则返回“缺少节点”(即isMissingNode返回true)将返回。这样可以通过路径调用方便,安全地链接访问。
             *
             * get: 一种访问对象节点指定字段值的方法。如果此节点不是对象(或者它没有指定字段名称的值),
             * 或者没有该名称的字段,则返回null。注意:如果属性值已显式设置为null(这与删除操作不同!),
             * 则将返回com.fasterxml.jackson.databind.node.NullNode,而不是null。
             */
            JsonNode path = dataNode.path("path");
            System.out.println("path obj:" + path.getClass().getName());
            
            JsonNode get = dataNode.get("get");
            System.out.println("get obj:" + get);

            System.out.println("path:" + dataNode.path("path").asText());
            // 抛出NullPointerException异常
            System.out.println("get:" + dataNode.get("get").asText());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
// 上述代码输出结果
{"code":0,"message":"成功","data":{"fileUrl":"https://www.baidu.com","fileVersionName":"v0.0.1"}}
{"fileUrl":"https://www.baidu.com","fileVersionName":"v0.0.1"}
path obj:com.fasterxml.jackson.databind.node.MissingNode
get obj:null
path:
java.lang.NullPointerException
	at com.kkcode.kkclass.service.impl.ResourceServiceImpl.main(ResourceServiceImpl.java:211)

最终结论:两者的区别在于如果要读取的key在Json串中不存在时,get方法会null,而path会返回MissingNode实例对象,在链路方法情况下保证不会抛出异常。

你可能感兴趣的:(#,开发过程中的疑惑,ObjectMapper)