JsonSerializer 的作用

JsonSerializer 是 Jackson 库提供的自定义序列化器接口,用于控制 Java 对象如何转换为 JSON 格式


核心作用

        格式控制:自定义数值精度、日期格式、字符串处理等
        数据脱敏:隐藏敏感信息(如手机号、身份证)
        类型转换:将复杂对象转为简化结构
        条件输出:根据业务逻辑动态决定字段值

常见用法场景

字段级别应用(最常用)
public class User {
    private String name;
    
    @JsonSerialize(using = PhoneMaskSerializer.class)
    private String phone;  // 序列化为 138****5678
    
    @JsonSerialize(using = PrecisionDoubleSerializer.class)
    private BigDecimal salary;  // 保留2位小数
}

// 自定义序列化器
public class PhoneMaskSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) 
            throws IOException {
        if (value != null && value.length() == 11) {
            gen.writeString(value.substring(0, 3) + "****" + value.substring(7));
        } else {
            gen.writeString(value);
        }
    }
}
全局应用
@JsonComponent  // Spring Boot 自动注册为全局序列化器
public class PrecisionDoubleSerializer extends JsonSerializer<Number> {
    // 影响所有 Number 类型的字段
}
类级别应用
@JsonSerialize(using = CustomUserSerializer.class)
public class User {
    private String name;
    private String password;  // 可在序列化器中完全忽略此字段
}

public class CustomUserSerializer extends JsonSerializer<User> {
    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) 
            throws IOException {
        gen.writeStartObject();
        gen.writeStringField("name", user.getName());
        // 故意不输出 password
        gen.writeEndObject();
    }
}
日期格式化
public class DateSerializer extends JsonSerializer<Date> {
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) 
            throws IOException {
        gen.writeString(sdf.format(value));
    }
}

// 使用
public class Order {
    @JsonSerialize(using = DateSerializer.class)
    private Date createTime;  // → "2026-04-16 10:30:00"
}
枚举自定义输出
public enum OrderStatus {
    PENDING(0, "待支付"),
    PAID(1, "已支付");
    
    private int code;
    private String desc;
}

public class OrderStatusSerializer extends JsonSerializer<OrderStatus> {
    @Override
    public void serialize(OrderStatus status, JsonGenerator gen, SerializerProvider serializers) 
            throws IOException {
        gen.writeStartObject();
        gen.writeNumberField("code", status.getCode());
        gen.writeStringField("desc", status.getDesc());
        gen.writeEndObject();
    }
}

// 输出: {"code": 1, "desc": "已支付"} 而非 "PAID"
集合/Map 自定义
public class MapKeySerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String key, JsonGenerator gen, SerializerProvider serializers) 
            throws IOException {
        gen.writeFieldName(key.toUpperCase());  // Map 的 key 转大写
    }
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐