一、前言

Jackson是一个在Java中常用的JSON序列化和反序列化库,它具有操作简单、性能优秀、支持多种数据格式等特点,被广泛应用于各种服务端开发中。SpringMVC框架的默认json解析器也是Jackson。当前常见的json解析器还有Gson、fastjson等,jackson的优势是解析大的json文件处理速度快,运行时占用内存低,性能好。SpringBoot可以很方便的集成Jackson实现对JSON数据的读写。

二、SpringBoot集成

如果我们的SpringBoot项目有引入spring-boot-starter-web这个依赖,那么我们就不用手动引入jackson的依赖了,它会默认带有jackson依赖包。

SpringBoot集成Jackson实现JSON序列化_SpringBoot

Jackson核心模块介绍:

jackson-core:核心包,它提供基于流模式解析的相关API。

jackson-annotations:提供标准注解功能。

jackson-dababind:数据绑定包,提供基于对象绑定解析相关API。

如果我们没有引入spring-boot-starter-web这个依赖,要想使用jackson的话需要引入下面的依赖。

<!--jackson依赖-->
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.9.1</version> 
</dependency>


三、Jackson相关注解

@JsonProperty:这个注解用于属性上,作用是把该属性名称序列化成另外一个名称。例如我们把name属性序列化成userName。

@JsonProperty("userName")
private String name;

@JsonFormat:这个注解用于属性或方法上,作用是把属性的格式序列化成指定的格式。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
 private Date birthday;

@JsonPropertyOrder:这个注解用于类上,作用是指定属性在序列化后json中的顺序。

package com.example.nettydemo.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * @author qx
 * @date 2023/12/20
 * @des 测试实体
 */
@Entity
@Table(name = "t_user")
@Data
@JsonPropertyOrder({"id", "userName", "birthday", "age"})
public class User implements Serializable {

    private static final long serialVersionUID = -5834774138265230945L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonProperty("userName")
    private String name;

    @JsonIgnore
    private Integer age;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date birthday;
}

@JsonIgnore:这个注解用于属性上,作用是进行JSON操作时忽略这个属性。

@JsonIgnore
 private Integer age;

四、测试

1.Json数据转Java对象

Java实体类如下所示:

package com.example.nettydemo.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * @author qx
 * @date 2023/12/20
 * @des 测试实体
 */
@Entity
@Table(name = "t_user")
@Data
@JsonPropertyOrder({"id", "userName", "birthday", "age"})
public class User implements Serializable {

    private static final long serialVersionUID = -5834774138265230945L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonProperty("userName")
    private String name;

    @JsonIgnore
    private Integer age;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date birthday;
}

测试:

package com.example.nettydemo;

import com.example.nettydemo.entity.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @author qx
 * @date 2023/12/27
 * @des 测试
 */
@SpringBootTest
public class JacksonTest {

    @Test
    void testRead() throws JsonProcessingException {
        //1.定义一个json串
        String json = "{\"id\":1,\"userName\":\"qq\",\"age\":18,\"birthday\":\"2023-12-27 14:37:18\"}";
        //2.创建ObjectMapper类
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        //3.打印
        System.out.println(user);
    }
}

结果:

User(id=1, name=qq, age=null, birthday=Wed Dec 27 14:37:18 CST 2023)

2.Java对象转Json数据

package com.example.nettydemo;

import com.example.nettydemo.entity.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

/**
 * @author qx
 * @date 2023/12/27
 * @des 测试
 */
@SpringBootTest
public class JacksonTest {
    
    @Test
    void testWrite() throws JsonProcessingException {
        //1.创建对象
        User user = new User();
        user.setId(2L);
        user.setName("hello");
        user.setAge(20);
        user.setBirthday(new Date());

        //2.创建ObjectMapper类
        ObjectMapper mapper = new ObjectMapper();
        // 转json数据
        String json = mapper.writeValueAsString(user);
        //3.打印
        System.out.println(json);
    }
}

结果:

{"id":2,"userName":"hello","birthday":"2023-12-27 15:03:08"}