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. 最佳实践

  1. 避免过度自定义:仅在确实需要特殊格式时使用
  2. 利用注解组合@JsonSerialize + @JsonDeserialize 配合使用
  3. Spring Boot 集成:推荐通过 JacksonConfig 全局注册模块
  4. 性能考虑:自定义逻辑时注意避免性能瓶颈
  5. 文档化:给自定义序列化写清晰注释,便于维护

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 的自定义序列化和反序列化能力非常强大。通过 JsonSerializerJsonDeserializer 以及注解方式,我们可以轻松实现日期格式统一、枚举映射、敏感字段隐藏等业务需求。

掌握这些能力后,你在处理复杂 JSON 交互时将更加得心应手。

推荐学习资源


Java Jackson 自定义序列化和反序列化实战指南(完整示例)
http://clxhxhhr.top/posts/344/
作者
clxstart
发布于
2026-08-22
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。