Jackson注解@JsonIgnore与@JsonIgnoreProperties详解

小豆丁 13小时前 ⋅ 2 阅读
聊天记录
头像

@JsonIgnore @JsonIgnoreProperties 这两个jackson注解作用是什么?

头像

@JsonIgnore@JsonIgnoreProperties 都是 Jackson 库中用于控制 JSON 序列化/反序列化的注解,但它们的作用范围和使用方式不同:

1. @JsonIgnore

作用

  • 标注在单个字段或 getter/setter 方法上
  • 忽略特定的属性,使其不参与序列化(Java对象→JSON)和/或反序列化(JSON→Java对象)

使用示例

JAVA
public class User {
    private String username;
    
    @JsonIgnore
    private String password;  // 不会出现在 JSON 中
    
    @JsonIgnore
    public String getSecretData() {
        return "敏感信息";
    }
}

特点

  • 粒度较细,精确控制单个属性
  • 只能用在字段或方法上

2. @JsonIgnoreProperties

作用

  • 标注在类级别
  • 批量忽略多个属性
  • 可以控制序列化、反序列化或两者都忽略

使用示例

JAVA
@JsonIgnoreProperties({"password", "salt"})  // 忽略多个字段
public class User {
    private String username;
    private String password;  // 会被忽略
    private String salt;      // 会被忽略
    private String email;
}

// 更精细的控制
@JsonIgnoreProperties(
    value = {"password"},           // 序列化时忽略
    ignoreUnknown = true           // 反序列化时忽略未知属性
)
public class User {
    // ...
}

常用参数

JAVA
@JsonIgnoreProperties(
    value = {"prop1", "prop2"},    // 要忽略的属性列表
    ignoreUnknown = true,          // 反序列化时忽略JSON中的未知字段
    allowGetters = false,          // 是否允许getter方法
    allowSetters = true            // 是否允许setter方法
)

主要区别对比

特性 @JsonIgnore @JsonIgnoreProperties
作用级别 字段/方法级别 类级别
控制粒度 单个属性 多个属性
配置位置 分散在属性上 集中在类声明处
功能 相对简单 功能更丰富(支持忽略未知属性等)

使用场景建议

使用 @JsonIgnore

JAVA
// 适合:只需要忽略少数几个敏感字段
public class User {
    private String id;
    private String name;
    
    @JsonIgnore  // 只忽略这一个敏感字段
    private String ssn;  // 社会安全号
    
    // 其他字段正常序列化
}

使用 @JsonIgnoreProperties

JAVA
// 适合:需要批量管理或特殊配置
@JsonIgnoreProperties(
    value = {"createdBy", "updatedBy", "version"},  // 批量忽略审计字段
    ignoreUnknown = true  // 忽略前端多传的字段
)
public class ProductDTO {
    private String id;
    private String name;
    private Double price;
    // 审计字段会被自动忽略
    private String createdBy;
    private String updatedBy;
}

组合使用

JAVA
@JsonIgnoreProperties({"internalCode"})  // 类级别忽略
public class Order {
    private String orderNo;
    
    @JsonIgnore  // 方法级别额外忽略
    public String getInternalInfo() {
        return "内部信息";
    }
}

注意事项

  1. @JsonIgnoreProperties 优先级更高:如果同时使用,类级别的配置会覆盖字段级别的
  2. 继承关系@JsonIgnoreProperties 默认不会被子类继承,除非配置 inherit = true
  3. 性能考虑ignoreUnknown = true 可以防止反序列化时因多余字段而报错,但可能会隐藏问题

选择哪个注解取决于你的具体需求:需要精细控制单个属性用 @JsonIgnore,需要批量管理或特殊配置用 @JsonIgnoreProperties

全部评论: 0

    我有话说: