1086 字
约 3 分钟
1
Java Jackson 自定义序列化和反序列化实战指南(完整示例)
Java Jackson 自定义序列化和反序列化实战指南(完整示例)
在 Java 开发中,Jackson 是最流行的 JSON 处理库之一。它在序列化(Serialization)与反序列化(Deserialization)时提供了高度可扩展的自定义能力。通过自定义 Serializer 和 Deserializer,我们可以轻松解决普通 Jackson 默认行为无法满足的业务场景。
本教程将带你从零到一,掌握 Jackson 自定义序列化和反序列化的核心用法,并附上完整可运行示例。
1. Jackson 基础回顾
1.1 Jackson 是什么?
Jackson 是 Jackson JSON Processor 的简称,是 Spring Boot、Spring Cloud、FastJSON 等框架中默认使用的序列化方案。它能将 Java 对象轻松转换为 JSON,或将 JSON 反序列化为 Java 对象。
默认行为:
- 字段默认按名称序列化
- 枚举值直接转为字符串
- 日期对象转为时间戳或字符串
- 忽略
null值
1.2 常见需求场景
- 隐藏敏感字段(如密码)
- 日期格式统一为
yyyy-MM-dd HH:mm:ss - 枚举值转为自定义字符串(如
ACTIVE→正常) - 自定义特殊类型转换(如 UUID、BigDecimal)
- 排除某些字段或包含指定字段
2. 自定义序列化(Serializer)
2.1 什么是序列化?
将 Java 对象转换为 JSON 字符串的过程。
2.2 实现 JsonSerializer
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class CustomSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen,
SerializerProvider serializers) throws IOException {
// 自定义格式:yyyy-MM-dd HH:mm:ss
String formatted = value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
gen.writeString(formatted);
}
}
2.3 注解使用
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(using = CustomSerializer.class)
private LocalDateTime createdAt;
2.4 自定义字段排除
@JsonSerialize(using = CustomSerializer.class)
@JsonIgnoreProperties({"password"})
private User user;
// 或在类级别
@JsonIgnoreProperties({"hiddenField"})
private class User { ... }
3. 自定义反序列化(Deserializer)
3.1 什么是反序列化?
将 JSON 字符串解析为 Java 对象的逆过程。
3.2 实现 JsonDeserializer
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
public class CustomDeserializer extends JsonDeserializer<StatusEnum> {
@Override
public StatusEnum deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JacksonException {
String text = p.getText();
// 根据实际业务映射
if ("1".equals(text)) return StatusEnum.ACTIVE;
if ("2".equals(text)) return StatusEnum.INACTIVE;
throw new IllegalArgumentException("未知状态:" + text);
}
}
3.3 枚举自定义映射
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@JsonDeserialize(using = CustomDeserializer.class)
private StatusEnum status;
3.4 复杂类型反序列化
public class CustomObjectDeserializer extends JsonDeserializer<ComplexObject> {
@Override
public ComplexObject deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JacksonException {
JsonNode node = p.getCodec().readTree(p);
ComplexObject obj = new ComplexObject();
// 自定义解析逻辑
obj.setId(node.get("id").asText());
obj.setName(node.get("name").asText());
return obj;
}
}
4. 实战案例:Spring Boot 项目集成
4.1 添加依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
4.2 自定义配置(推荐方式)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 注册自定义序列化器
SimpleModule module = new SimpleModule();
module.addSerializer(LocalDateTime.class, new CustomDateTimeSerializer());
module.addDeserializer(StatusEnum.class, new CustomStatusDeserializer());
mapper.registerModule(module);
return mapper;
}
}
4.3 全局生效示例
@JsonSerialize(using = CustomDateSerializer.class)
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date createdAt;
5. 最佳实践
- 避免过度自定义:仅在确实需要特殊格式时使用
- 利用注解组合:
@JsonSerialize+@JsonDeserialize配合使用 - Spring Boot 集成:推荐通过
JacksonConfig全局注册模块 - 性能考虑:自定义逻辑时注意避免性能瓶颈
- 文档化:给自定义序列化写清晰注释,便于维护
6. 代码完整示例
6.1 实体类
public class User {
private String name;
@JsonSerialize(using = CustomDateSerializer.class)
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date createdAt;
}
6.2 序列化器实现
public class CustomDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator gen,
SerializerProvider serializers) throws IOException {
// 自定义日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(value);
gen.writeString(formattedDate);
}
}
6.3 反序列化器实现
public class CustomDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JacksonException {
String dateStr = p.getText();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
7. 总结
Jackson 的自定义序列化和反序列化能力非常强大。通过 JsonSerializer、JsonDeserializer 以及注解方式,我们可以轻松实现日期格式统一、枚举映射、敏感字段隐藏等业务需求。
掌握这些能力后,你在处理复杂 JSON 交互时将更加得心应手。
推荐学习资源:
- Jackson 官方文档
- Spring Boot 官方序列化配置指南
Java Jackson 自定义序列化和反序列化实战指南(完整示例)
http://clxhxhhr.top/posts/344/ 评论
0 条
还没有评论,先写一条吧。