jackson中可用@jsonproperty注解重命名字段:加在字段上指定新键名,使序列化和反序列化均使用该名称;也可通过access属性控制单向生效,或结合@jsonunwrapped实现扁平化嵌套。

在 Jackson 中,用 @JsonProperty 注解给字段重命名非常直接:把它加在字段声明上方,并指定新名称即可。Jackson 默认会把字段名作为 JSON 键,而 @JsonProperty("xxx") 会覆盖这个默认行为,让序列化和反序列化都使用你指定的键名。
基础用法:字段上直接加注解
这是最常用的方式。只要字段是 public、protected、package-private 或 private(配合默认 getter/setter 或开启字段访问),Jackson 都能识别。
- 字段必须有 getter/setter(或开启
Visibility配置支持直接访问私有字段) - 注解写在字段声明行,不是 getter 方法上(除非你只希望影响序列化/反序列化中的某一方)
- 例如:
public class User {
@JsonProperty("user_name")
private String username;
@JsonProperty("full_name")
private String name;
// 构造函数、getter、setter 省略
}
序列化结果:{"user_name":"alice","full_name":"Alice Smith"}
只控制序列化或反序列化方向
如果只想改输出(序列化)的字段名,但保留原名用于输入(反序列化),可以用 @JsonProperty 的 value 和 access 属性组合:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
@JsonProperty(value = "id", access = JsonProperty.Access.READ_ONLY)→ JSON 输出用"id",但反序列化时仍接受原字段名(如userId)或不处理该字段 -
@JsonProperty(value = "input_code", access = JsonProperty.Access.WRITE_ONLY)→ 只在反序列化时认"input_code",序列化时不出现
配合 @JsonUnwrapped 实现嵌套扁平化
当字段类型本身是 POJO,且你想把它“展开”到外层 JSON 中,可以结合 @JsonUnwrapped 和 @JsonProperty:
public class Order {
@JsonProperty("order_id")
private Long id;
@JsonUnwrapped(prefix = "customer_")
@JsonProperty("customer")
private Person customer; // 假设 Person 有 name/email 字段
}
序列化后变成:{"order_id":123,"customer_name":"Bob","customer_email":"bob@example.com"}
注意点:避免和 getter/setter 上的注解冲突
如果字段和对应的 getter 都加了 @JsonProperty,Jackson 优先采用 getter 上的注解(对序列化),setter 上的优先用于反序列化。所以建议统一放在字段上,或统一放在 getter/setter 上,不要混用。
- 字段级注解更简洁,适合字段名和 JSON 键差异大的场景
- 如果用了 Lombok,确保
@Data/@Getter/@Setter不会意外覆盖你的注解(Lombok 生成的方法默认不带注解) - 字段名含下划线、驼峰不一致、或想兼容旧 API 接口时,这种重命名特别实用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










