@JsonProperty是 Jackson 库中用于 JSON 序列化和反序列化的核心注解,主要作用如下:
核心功能
1. 指定 JSON 字段名
将 Java 属性映射到不同的 JSON 键名:
java
复制
public class User { @JsonProperty("user_name") // JSON 中显示为 user_name private String userName; @JsonProperty("user_age") // JSON 中显示为 user_age private int age; }2. 支持反序列化
即使 JSON 字段名与 Java 属性名不一致,也能正确映射:
java
复制
// JSON: {"user_name": "张三", "user_age": 25} User user = objectMapper.readValue(json, User.class); // user.getUserName() → "张三"3. 控制字段可见性
即使字段是
private的,也能通过注解暴露给 Jackson不需要显式添加 getter/setter(配合其他配置)
常用参数
表格
| 参数 | 说明 | 示例 |
|---|---|---|
value | 指定 JSON 字段名 | @JsonProperty("name") |
required | 反序列化时该字段是否必须存在 | @JsonProperty(value="id", required=true) |
defaultValue | 指定默认值 | @JsonProperty(defaultValue="0") |
access | 控制访问权限(只读/只写/读写) | 见下方示例 |
高级用法
控制读写权限
java
复制
public class User { // 只序列化到 JSON,不反序列化(如密码) @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password; // 只从 JSON 读取,不序列化(如敏感信息) @JsonProperty(access = JsonProperty.Access.READ_ONLY) private String token; }用于方法
java
复制
@JsonProperty("full_name") public String getFullName() { return firstName + " " + lastName; }用于构造参数
java
复制
public class User { private final String name; public User(@JsonProperty("name") String name) { this.name = name; } }对比其他注解
表格
| 注解 | 用途 | 适用场景 |
|---|---|---|
@JsonProperty | 指定字段名、控制访问 | 字段名映射、安全控制 |
@JsonIgnore | 完全忽略字段 | 不需要序列化的字段 |
@JsonAlias | 指定反序列化时的别名 | 兼容多个 JSON 字段名 |
@JsonFormat | 格式化日期/数字 | 日期格式转换 |
完整示例
java
复制
import com.fasterxml.jackson.annotation.JsonProperty; public class Product { @JsonProperty("product_id") private Long id; @JsonProperty("product_name") private String name; @JsonProperty(value = "price", required = true) private Double price; @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Date createTime; // 构造器、getter、setter... }输出 JSON:
JSON
复制
{ "product_id": 1001, "product_name": "iPhone", "price": 5999.00, "createTime": "2024-01-15T10:30:00" }@JsonProperty是处理 Java 对象与 JSON 之间映射最常用的注解,特别是在字段命名规范不一致(如 Java 驼峰命名 vs JSON 下划线命名)时非常实用。