写在最前
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
源码地址(后端):gitee.com/csps/mingyu…
源码地址(前端):gitee.com/csps/mingyu…
文档地址:gitee.com/csps/mingyu…
Jackson
Jackson 是一个用于在 Java 中处理 JSON 数据的流行库。它提供了一组工具,用于将 JSON 数据解析成 Java 对象(反序列化)以及将 Java 对象序列化成 JSON 格式。Jackson 在 Java 应用程序中广泛使用,尤其在处理 JSON 数据的 Web 服务和 API 中。
以下是 Jackson 的一些关键功能和组件:
ObjectMapper
类是 Jackson 的核心组件。它允许您将 JSON 数据转换为 Java 对象(反序列化)并将 Java 对象转换为 JSON 数据(序列化)。@JsonProperty
、@JsonIgnore
和 @JsonFormat
。序列化与反序列化
序列化和反序列化是编程中常用的两个概念,它们通常用于将数据从一种格式转换为另一种格式,例如将对象转换为字节流或将数据转换为 JSON 格式。这两个过程在数据存储、数据传输和数据持久化等方面都很重要。
- 定义:序列化是将对象或数据结构转换为可存储或传输的形式的过程,通常是将其转换为字节流或文本格式,以便稍后可以还原为原始对象或数据结构。
- 示例:在 Java 中,使用 Jackson 或 Java 自带的
ObjectOutputStream
来将 Java 对象序列化为字节流。在网络通信中,将数据转换为 JSON 或 XML 格式以便传输也是一种序列化。
- 定义:反序列化是将序列化后的数据重新转换为原始对象或数据结构的过程。这是序列化的逆操作。
- 示例:在 Java 中,使用 Jackson 或 Java 自带的
ObjectInputStream
来从字节流反序列化为 Java 对象。在网络通信中,将接收到的 JSON 或 XML 数据还原为程序可用的数据结构也是一种反序列化。
序列化和反序列化在许多编程场景中都非常有用,例如:
- 数据持久化:将对象的状态保存到磁盘上的文件中,以便在应用程序重新启动时可以恢复数据。
- 网络通信:在客户端和服务器之间传递数据时,将数据序列化为可传输的格式,然后在接收端进行反序列化。
- 缓存:将对象序列化后存储在缓存中,以便快速检索,而不必每次都重新创建对象。
- 远程过程调用 (RPC):在分布式系统中,将方法调用参数序列化为网络传输格式,然后在远程服务器上进行反序列化和方法调用。
- 消息队列:在消息传递系统中,将消息序列化为一种格式,以便在多个应用程序之间传递消息。
配置全局序列化与反序列化
添加依赖
com.fasterxml.jackson.core
jackson-databind
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
Jackson 配置
@Slf4j
@AutoConfiguration(before = JacksonAutoConfiguration.class)
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
// 全局配置序列化返回 JSON 处理
JavaTimeModule javaTimeModule = new JavaTimeModule();
// Jackson 序列化 Long 类型超出 JS 最大最小值序列化位字符串转为 String,解决后端返回的类型在前端精度丢失的问题
javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
// Jackson 序列化 BigDecimal 类型为 String,解决后端返回的类型在前端精度丢失的问题
javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
// ======================= 时间序列化规则 =======================
// yyyy-MM-dd HH:mm:ss
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMATTER));
// yyyy-MM-dd
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));
// HH:mm:ss
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME));
// Instant 类型序列化
javaTimeModule.addSerializer(Instant.class, InstantSerializer.INSTANCE);
// ======================= 时间反序列化规则 =======================
// yyyy-MM-dd HH:mm:ss
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DatePattern.NORM_DATETIME_FORMATTER));
// yyyy-MM-dd
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));
// HH:mm:ss
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME));
// Instant 反序列化
javaTimeModule.addDeserializer(Instant.class, InstantDeserializer.INSTANT);
builder.modules(javaTimeModule);
// 时区配置
builder.timeZone(TimeZone.getDefault());
log.info("初始化 Jackson 配置");
};
}
}
AutoConfiguration.imports
com.csp.mingyue.common.core.config.JacksonConfig
测试
添加前
[
{
"userId": 1,
"createTime": "2023-07-19T17:06:22",
"updateTime": "2023-07-19T17:06:25",
}
]
添加后
[
{
"userId": 1,
"createTime": "2023-07-19 17:06:22",
"updateTime": "2023-07-19 17:06:25",
}
]