@JsonProperty解决序列号字段不一致问题

@JsonProperty 是 Jackson 库中的一个注解,用于 控制 Java 对象与 JSON 数据之间的字段映射关系。它常用于解决字段名不一致、自定义序列化/反序列化逻辑等场景。以下是详细说明:


核心功能

  1. 字段名映射
    将 Java 对象的属性名与 JSON 中的字段名绑定,即使二者名称不同。

    public class User {
        @JsonProperty("user_name") // JSON 字段名为 user_name
        private String name;
    }
    
  2. 序列化(Java → JSON)
    对象转 JSON 时,指定字段的输出名称:

    User user = new User("Alice");
    String json = objectMapper.writeValueAsString(user);
    // 输出: {"user_name":"Alice"}
    
  3. 反序列化(JSON → Java)
    JSON 转对象时,将 JSON 字段映射到 Java 属性:

    String json = "{\"user_name\":\"Bob\"}";
    User user = objectMapper.readValue(json, User.class);
    // user.getName() 返回 "Bob"
    

常见使用场景

1. 解决命名风格差异
  • JSON 使用 snake_case,Java 使用 camelCase
    @JsonProperty("first_name")
    private String firstName;
    
2. 标记必填字段
@JsonProperty(required = true)
private String id;

反序列化时,若 JSON 中缺少 id 字段,会抛出异常。

3. 绑定到构造方法参数

如果类使用构造方法初始化,需在参数上添加 @JsonProperty

public class Product {
    private final String sku;
    @JsonCreator
    public Product(@JsonProperty("product_sku") String sku) {
        this.sku = sku;
    }
}
4. 忽略某些字段

结合 @JsonIgnore 排除不需要序列化的字段:

@JsonIgnore
private String password;

与其他注解配合

  • @JsonFormat:指定日期格式

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthDate;
    
  • @JsonInclude:控制空值字段是否序列化

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String address;
    
  • @JsonAlias:为字段定义多个 JSON 别名

    @JsonProperty("name")
    @JsonAlias({"full_name", "username"})
    private String name;
    

注意事项

  1. Lombok 兼容性
    若使用 Lombok 的 @Data@Getter/@Setter,需确保注解生成的方法与 Jackson 无冲突。

  2. 版本兼容性
    Jackson 2.12+ 支持更灵活的构造方法绑定,旧版本可能需要 @JsonCreator 显式标记。

  3. 静态工厂方法
    若通过静态方法创建对象,需配合 @JsonCreator

    public class Order {
        @JsonCreator
        public static Order fromJson(@JsonProperty("order_id") String id) {
            return new Order(id);
        }
    }
    

示例代码

public class Book {
    @JsonProperty("book_title")
    private String title;

    @JsonProperty(value = "publish_year", required = true)
    private int year;

    @JsonIgnore
    private String internalNotes;

    // 构造方法、Getter/Setter 省略
}

// 序列化结果
// {"book_title":"1984","publish_year":1949}

通过 @JsonProperty,可以精准控制 Java 对象与 JSON 之间的转换逻辑,适应各种复杂的数据交互场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值