序列化过滤 JsonSerializer
·
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 转大写
}
}
更多推荐
所有评论(0)