一、前言
Jackson是一个在Java中常用的JSON序列化和反序列化库,它具有操作简单、性能优秀、支持多种数据格式等特点,被广泛应用于各种服务端开发中。SpringMVC框架的默认json解析器也是Jackson。当前常见的json解析器还有Gson、fastjson等,jackson的优势是解析大的json文件处理速度快,运行时占用内存低,性能好。SpringBoot可以很方便的集成Jackson实现对JSON数据的读写。
二、SpringBoot集成
如果我们的SpringBoot项目有引入spring-boot-starter-web这个依赖,那么我们就不用手动引入jackson的依赖了,它会默认带有jackson依赖包。
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"}