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

一.简介

今天同事有个需求,要把一个JSON字符串转换成一个树结构的数据并获取节点数据,鉴于自己不想写递归去转换,于是使用ObjectMapper和JsonNode类去实现。

二.依赖

pom文件引入依赖:


  com.fasterxml.jackson.core
  jackson-core
  2.9.6



  com.fasterxml.jackson.core
  jackson-annotations
  2.9.6



  com.fasterxml.jackson.core
  jackson-databind
  2.9.6


三.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;

你可能感兴趣的:(Java开发,json,java)