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]