Java:使用Jackson的jsonPtrExp获取节点值的问题说明

news/2024/11/14 3:19:18/

使用Jackson时解析json时,经常会使用jsonPath直接获取某一节点下的值,这种方式非常直观 ,例如:

{

  “data”: {

    "test1": "value1",

    "test2": null,

    "test3": 10

  }

}

 以Jackson2.13.5,使用at(jsonPtrExp)这种API,解析json的代码:

java">ObjectMapper objectMapper = new ObjectMapper();String content = "{"data": {\"test1\": \"value1\",\"test2\": null,\"test3\": 10}}";JsonNode root = objectMapper.readTree(content);JsonNode node = root.at("/data/test1");node.asText();       # 1
node.textValue();    # 2

这里有个让人疑惑的地方,获取其中的值时,到底应该用#1还是#2。

我们写一个测试用例,来看看它们的区别:

java">import java.io.IOException;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;public class JacksonTester {public static void main(String[] args) throws IOException {ObjectMapper objectMapper = new ObjectMapper();String content = "{"data": {\"test1\": \"value1\",\"test2\": null,\"test3\": 10}}";JsonNode root = objectMapper.readTree(content);{JsonNode node = root.at("/data/test1");System.out.println("node.isMissingNode()##" + node.isMissingNode());System.out.println("node.isNull()##" + node.isNull());System.out.println("node.asText() == null##" + (node.asText() == null));System.out.println("node.asText()##" + node.asText());System.out.println("node.textValue() == null##" + (node.textValue() == null));System.out.println("node.textValue()##" + node.textValue());System.out.println("-------------");}{JsonNode node = root.at("/data/test2");System.out.println("node.isMissingNode()##" + node.isMissingNode());System.out.println("node.isNull()##" + node.isNull());System.out.println("node.asText() == null##" + (node.asText() == null));System.out.println("node.asText()##" + node.asText());System.out.println("node.textValue() == null##" + (node.textValue() == null));System.out.println("node.textValue()##" + node.textValue());System.out.println("-------------");}{JsonNode node = root.at("/data/test3");System.out.println("node.isMissingNode()##" + node.isMissingNode());System.out.println("node.isNull()##" + node.isNull());System.out.println("node.asText() == null##" + (node.asText() == null));System.out.println("node.asText()##" + node.asText());System.out.println("node.textValue() == null##" + (node.textValue() == null));System.out.println("node.textValue()##" + node.textValue());System.out.println("-------------");}{JsonNode node = root.at("/data/test4");System.out.println("node.isMissingNode()##" + node.isMissingNode());System.out.println("node.isNull()##" + node.isNull());System.out.println("node.asText() == null##" + (node.asText() == null));System.out.println("node.asText()##" + node.asText());System.out.println("node.textValue() == null##" + (node.textValue() == null));System.out.println("node.textValue()##" + node.textValue());System.out.println("-------------");}}}

执行结果:

node.isMissingNode()##false
node.isNull()##false
node.asText() == null##false
node.asText()##value1
node.textValue() == null##false
node.textValue()##value1
-------------
node.isMissingNode()##false
node.isNull()##true
node.asText() == null##false
node.asText()##null
node.textValue() == null##true
node.textValue()##null
-------------

node.isMissingNode()##false
node.isNull()##true
node.asText() == null##false
node.asText()##10
node.textValue() == null##true
node.textValue()##null
-------------
node.isMissingNode()##true
node.isNull()##false
node.asText() == null##false
node.asText()##
node.textValue() == null##true
node.textValue()##null
-------------

 从执行结果中可以看到

节点值为null时节点不存在时节点值为字符串时节点值不为字符串时
asText()“null”"""value1""10"
textValue()nullnull"value1"null

从结果上看,如果要使用asText() ,应该是要先做如下判断

java">if (!node.isMissingNode() && !node.isNull())
{String value = node.asText();
}

如果是使用textValue() ,只要节点值的类型是字符串,不用判断isMissingNode()和node.isNull(),就可以直接使用。


http://www.ppmy.cn/news/1546334.html

相关文章

java的JJWT 0.91在jdk21中报错的解决方法

参考了很多其他人的办法,只有这种方式可以解决问题 JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西 如果根据黑马的视频,导入了阿里云OSS的相关依赖,自然不会…

JS事件高级练习题

1、用js实现验证码的获取和验证 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Document</title><style>body {margin: 0;}.v_code {width: 300px;height: 200px;border: 1px solid re…

一学就废|Python基础碎片,常用数据类型

字符串 String 与其他编程语言不同&#xff0c;Python 不直接支持字符串的项赋值。因此&#xff0c;如果需要操作字符串的项&#xff0c;例如交换项&#xff0c;我们必须将字符串转换为列表&#xff0c;并在一系列项赋值完成后进行连接操作。 a "Hello Python" l …

3588 yolov8 onnx 量化转 rknn 并运行

本教程重点不在如何训练模型&#xff0c;重点是全流程链路&#xff0c;想学训练的可以网上找教程 环境 python 3.10.xrknn-toolkit2-2.2.0ultralytics_yolov8rknn 驱动版本2.2 模型训练 yolov8仓库地址&#xff1a;https://github.com/airockchip/ultralytics_yolov8.git下载…

go函数传值是值传递?还是引用传递?slice案例加图解

先说下结论 Go语言中所有的传参都是值传递&#xff08;传值&#xff09;&#xff0c;都是一个副本&#xff0c;一个拷贝。 值语义类型&#xff1a;参数传递的时候&#xff0c;就是值拷贝&#xff0c;这样就在函数中就无法修改原内容数据。 基本类型&#xff1a;byte、int、bool…

Scala的List

Scala 的 List 是一种不可变的、链式的数据结构&#xff0c;用于存储有序的元素集合。 List 是 Scala 中最常用的集合类型之一&#xff0c;具有不可变性、不可变长度和高效的递归操作等特点。List 的设计基于函数式编程范式&#xff0c;强调不可变性和函数式操作。 1. 基本概…

《深入浅出HTTPS​​​​》读书笔记(5):随机数

密码学中随机数的用途非常大&#xff0c;其他密码学算法内部都会用到随机数。 1&#xff09;效率 在软件或者密码学应用中需要大量的随机数&#xff0c;必须在很短的时间内生成随机数。 2&#xff09;随机性 生成的随机数只要不存在统计学偏差&#xff0c;那么这个随机数就具备…

如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息

目录 前言一、什么是Web Scraper API二、Web Scraper API 的优势&#xff1a;三、Web Scraper API 适用场景四、实践案例目标需求视频讲解1、选择Web Scraper API2、登录注册3、进入用户控制面板4、选择API5、触发数据收集 API6、获取爬虫结果7、分析爬虫结果&#xff08;1&…