Jackson使用详解

1. Jackson介绍

Jackson一个java处理json的类库,社区活跃,更新速度也很快。相比gson、fastjson等,强力推荐使用Jackson。

Jackson 有三个核心包,分别是 Streaming、Annotations、Databind,通过这些包可以方便的对 JSON 进行操作。
Streaming 在 jackson-core 模块。定义了一些低级别流处理相关的API以及特定的JSON实现。
Annotations 在 jackson-annotations 模块,包含了Jackson中的注解。
Databind 在 jackson-databind 模块, 在Streaming包的基础上实现了数据绑定,依赖于Streaming和Annotations包。

2. Jackson maven引入

我们需要引入以上三个核心模块,不过由于jackson-databind依赖了jackson-core和 jackson-annotations,所以只需要引入jackson-databind即可。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.2</version>
</dependency>
<!--		
<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.13.2</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.13.2</version>
    </dependency>
-->

3. 主要类和api介绍

ObjectMapper

ObjectMapper提供了读写JSON的功能,既可以读写基本pojo,也可以读写通用JSON树模型(JsonNode),还提供了执行转换的相关功能。之所以称为ObjectMapper就是因为他负责json和java对象之间的映射转换。(对于时间类型的转换,要注意字符串的时间格式,不满足则使用objectMapper.setDateFormat来设置时间格式)常用的方法如:

1)readValue方法将json反序列化为java对象

readValue接收参数 Class/JavaType/TypeReference,JavaType只能通过com.fasterxml.jackson.databind.type.TypeFactory来创建,TypeReference是抽象类,直接new匿名实现即可。比如构造 Map<String, Object>,

new TypeReference<Map<String, Object>>() {};
objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class);

2)writeValue方法将对象序列化成指定目标

3)readTree方法将json反序列化为JsonNode

4)valueToTree方法将java对象转换为JsonNode

 

5)treeToValue方法将JsonNode转换为java对象

JsonNode

 所有JSON节点的基类,它构成了Jackson实现的JSON树模型(JSON Tree Model)的基础。可以将其视为类似于XML DOM树中的DOM节点。若想修改或访问 json 部分属性,树模型是不错的选择。程序中常用的子类是ObjectNode。

1)xxxValue方法 返回该节点的对应类型值(和asXXX的区别就是asXXX有个转换的过程)

2)get 方法获取到某个节点

3)findValue方法查找某个节点

4. 使用案例

包含 json字符串转换为 java对象,json字符串转换为 java map,json数组转换为 java list,java对象转换为 json字符串,树模型处理获取 json字符串里某个字段值,修改 json字符串里的字段值等。

代码示例如下:

public class Test {

    public static void main(String[] args) throws JsonProcessingException {
        String jsonStr = "{\"userId\":1001,\"userName\":\"iouy\",\"city\":\"chengdu\",\"age\":21,\"sex\":1," +
                "\"phone\":\"15227654561\",\"address\":\"凤凰大街118号\",\"registerTime\":\"2024-03-11 13:11:11\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonArray = "[{\"userId\":1001,\"userName\":\"iouy\",\"city\":\"chengdu\",\"age\":21,\"sex\":1," +
                "\"phone\":\"15227654561\",\"address\":\"凤凰大街118号\",\"registerTime\":\"2024-03-11 13:11:11\"}," +
                "{\"userId\":1002,\"userName\":\"kdas\",\"city\":\"chengdu\",\"age\":22,\"sex\":0," +
                "\"phone\":\"15127654561\",\"address\":\"凤凰大街111号\",\"registerTime\":\"2022-03-11 12:13:13\"}]";
        // json字符串转换为 java对象
        Person person = objectMapper.readValue(jsonStr, Person.class);
        System.out.println("json字符串转换为 java对象");
        System.out.println(person);
        // json字符串转换为 java map
        Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, Map.class);
        // 或者通过以下两种方式传参
        // Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class));
        //  Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
        System.out.println("json字符串转换为 java map");
        System.out.println(jsonMap);
        //json数组转换为 java list
        List<Person> personList = objectMapper.readValue(jsonArray, new TypeReference<List<Person>>() {});
        System.out.println("json数组转换为 java list");
        System.out.println(personList);
        // java对象转换为 json字符串
        String jsonStrFromJavaPerson  = objectMapper.writeValueAsString(person);
        System.out.println("java对象转换为 json字符串");
        System.out.println(jsonStrFromJavaPerson);
        // 树模型处理
        // 获取 json字符串里某个字段值
        JsonNode jsonNode = objectMapper.readTree(jsonStr);
        System.out.println("获取json字符串里的 city字段值");
        System.out.println(jsonNode.get("city").textValue());
        // 修改 json字符串里的 city值
        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.put("city", "city_change");
        System.out.println("修改city值后的json字符串为");
        System.out.println(objectNode.toString());
    }

    public static class Person {
        private long userId;
        private String userName;
        private String city;
        private int age;
        private int sex;
        private String phone;
        private String address;
        private String registerTime;

        public Person() {
        }

        public long getUserId() {
            return userId;
        }

        public void setUserId(long userId) {
            this.userId = userId;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public int getSex() {
            return sex;
        }

        public void setSex(int sex) {
            this.sex = sex;
        }

        public String getPhone() {
            return phone;
        }

        public void setPhone(String phone) {
            this.phone = phone;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public String getRegisterTime() {
            return registerTime;
        }

        public void setRegisterTime(String registerTime) {
            this.registerTime = registerTime;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "userId=" + userId +
                    ", userName='" + userName + '\'' +
                    ", city='" + city + '\'' +
                    ", age=" + age +
                    ", sex=" + sex +
                    ", phone='" + phone + '\'' +
                    ", address='" + address + '\'' +
                    ", registerTime='" + registerTime + '\'' +
                    '}';
        }
    }
}

运行结果如下:

json字符串转换为 java对象
Person{userId=1001, userName='iouy', city='chengdu', age=21, sex=1, phone='15227654561', address='凤凰大街118号', registerTime='2024-03-11 13:11:11'}
json字符串转换为 java map
{userId=1001, userName=iouy, city=chengdu, age=21, sex=1, phone=15227654561, address=凤凰大街118号, registerTime=2024-03-11 13:11:11}
json数组转换为 java list
[Person{userId=1001, userName='iouy', city='chengdu', age=21, sex=1, phone='15227654561', address='凤凰大街118号', registerTime='2024-03-11 13:11:11'}, Person{userId=1002, userName='kdas', city='chengdu', age=22, sex=0, phone='15127654561', address='凤凰大街111号', registerTime='2022-03-11 12:13:13'}]
java对象转换为 json字符串
{"userId":1001,"userName":"iouy","city":"chengdu","age":21,"sex":1,"phone":"15227654561","address":"凤凰大街118号","registerTime":"2024-03-11 13:11:11"}
获取json字符串里的 city字段值
chengdu
修改city值后的json字符串为
{"userId":1001,"userName":"iouy","city":"city_change","age":21,"sex":1,"phone":"15227654561","address":"凤凰大街118号","registerTime":"2024-03-11 13:11:11"}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值