> 文章列表 > 通过ObjectMapper和JsonNode 把JSON字符串转换成树结构数据和获取树节点数据

通过ObjectMapper和JsonNode 把JSON字符串转换成树结构数据和获取树节点数据

通过ObjectMapper和JsonNode 把JSON字符串转换成树结构数据和获取树节点数据

一.简介

今天同事有个需求,要把一个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();}}

运行结果如下:
通过ObjectMapper和JsonNode 把JSON字符串转换成树结构数据和获取树节点数据

通过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;