@JsonProperty 是 Jackson 库中的一个注解,用于 控制 Java 对象与 JSON 数据之间的字段映射关系。它常用于解决字段名不一致、自定义序列化/反序列化逻辑等场景。以下是详细说明:
核心功能
-
字段名映射
将 Java 对象的属性名与 JSON 中的字段名绑定,即使二者名称不同。public class User { @JsonProperty("user_name") // JSON 字段名为 user_name private String name; } -
序列化(Java → JSON)
对象转 JSON 时,指定字段的输出名称:User user = new User("Alice"); String json = objectMapper.writeValueAsString(user); // 输出: {"user_name":"Alice"} -
反序列化(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;
注意事项
-
Lombok 兼容性
若使用 Lombok 的@Data或@Getter/@Setter,需确保注解生成的方法与 Jackson 无冲突。 -
版本兼容性
Jackson 2.12+ 支持更灵活的构造方法绑定,旧版本可能需要@JsonCreator显式标记。 -
静态工厂方法
若通过静态方法创建对象,需配合@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 之间的转换逻辑,适应各种复杂的数据交互场景。

803

被折叠的 条评论
为什么被折叠?



