在项目中有一个需求需要读取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实例对象,在链路方法情况下保证不会抛出异常。