一.简介
今天同事有个需求,要把一个JSON字符串转换成一个树结构的数据并获取节点数据,鉴于自己不想写递归去转换,于是使用ObjectMapper和JsonNode类去实现。
二.依赖
pom文件引入依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
三.JSON字符串数据如下:
{
"id":"1",
"name":"科技部门",
"parentId":"root",
"children":{
"id":"2",
"name":"研发部门",
"parentId":"1",
"children":{
"id":"3",
"name":"后端部门",
"parentId":"2",
"children":null
}
}
}
四.代码如下:
public static void main(String[] args) {
String json = "{\n" +
" \"id\":\"1\",\n" +
" \"name\":\"科技部门\",\n" +
" \"parentId\":\"root\",\n" +
" \"children\":{\n" +
" \"id\":\"2\",\n" +
" \"name\":\"研发部门\",\n" +
" \"parentId\":\"1\",\n" +
" \"children\":{\n" +
" \"id\":\"3\",\n" +
" \"name\":\"后端部门\",\n" +
" \"parentId\":\"2\",\n" +
" \"children\":null \n" +
" } \n" +
" } \n" +
"}";
try{
ObjectMapper objectMapper = new ObjectMapper();
JsonNode readTree = objectMapper.readTree(json);
System.out.println(readTree);
}catch (Exception e){
e.printStackTrace();
}
}
运行结果如下:
通过get(fieldName)方法获取节点数据
五.额外补充
1、jackson通过get(“字段名”)api方法获取JsonNode对象时,如果该字段不存在,返回null;
2、如果json数据的某个字段值是基本类型(非object、array),可以使用jackson提供的asText、textValue,asInt、intValue…等方法来获取字段的值;如果字段值是复杂类型,那么上述方法将失效,可以使用toString()、toPrettyString()方法打印值。
3、对于字段值是基本类型的数据,如果是String类型,用 asText() 和 textValue() 获取的结果是一致的;同理,如果是int类型,用asInt()、intValue()获取的结果也是一致的;
4、asText()和textValue()方法都是获取字段是String基本类型的数据,区别是:
asText()会进行强转,如果字段值不是string基本类型数据,会将其转成String基本类型的数据;(如果是复杂类型,返回空字符串)
textValue()只针对String基本类型数据,所以如果字段值是非String基本类型数据,则返回null;
同理,asInt()和intValue()方法也是一样的:
asInt()会进行强转,比如字符串类型的数字转成数字,如果强转失败(比如字符串abc),返回0;(如果是复杂类型,返回0)
intValue()只针对int节本类型数据,对于非int基本类型数据,intValue返回0;