飞不高 发表于 2024-11-12 20:45:19

Java:使用Jackson剖析json时如何精确获取节点中的值?

使用Jackson剖析json时,经常会必要获取到某一节点下的值,例如:
   {
  “data”: {
    "test1": "value1",
    "test2": null,
    "test3": 10
  }
}
 以Jackson2.13.5为例,使用at(jsonPtrExp)这种API,剖析json的代码并获取节点值的方法:
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。
我们写一个测试用例,来看看它们的区别:
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 以下是JsonNode的子类及它们的条理结构
https://i-blog.csdnimg.cn/direct/b0fce10d61d4416a915429bfb338dad2.png
下面总结一下,当节点为上述范例并且值不为空时,asText()和textValue()获取到的值,以及精确获取值的方法
asText()textValue()获取值的方法ArrayNode""null使用elements()遍历ObjectNode""null使用elements()遍历BinaryNode二进制的Base64编码后的值nullbinaryValue()BooleanNode"true" / "false"nullbooeanValue()MissingNode""nullNullNode"null"null直接赋值为nullNumberNode数字对应的字符串null bigIntegerValue()
decimal()
doubleValue()
intValue()
longValue()
POJONode内部包罗的对象toString()返回值nullgetPojo()TextNode字符串值字符串值 textValue()
asText()
综上,如果想要获取到各种范例节点实际的值,必要先将它转换成对应的范例,再使用对应范例的相应方法。
但如果只是想获取到ValueNode及其子范例节点的字符串值,只必要做如下判断后,直接使用asText()即可
if (!node.isMissingNode() && !node.isNull())
{
String value = node.asText();
}  如果是使用textValue() ,只要节点值的范例是字符串,不消判断isMissingNode()和node.isNull(),就可以直接使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java:使用Jackson剖析json时如何精确获取节点中的值?