Spring Boot:JSON属性重命名后值为null的问题及解决方法
解决Spring Boot中JSON字段名输入输出不一致问题
你的问题核心是需要分别控制JSON反序列化(接收外部服务数据)和序列化(自身服务返回数据)的字段名:外部返回的是cap,但自身要返回CAP。直接用@JsonProperty("CAP")会同时影响反序列化和序列化,导致反序列化时找不到CAP字段,值为null;不加则序列化返回的是cap,不符合需求。
以下是几种可行的解决方案:
方案一:结合@JsonAlias和@JsonProperty
@JsonAlias用于指定反序列化时可识别的字段别名,@JsonProperty指定序列化时输出的字段名,两者配合实现输入输出字段名不同:
@NoArgsConstructor @Data public class MyObject { @JsonProperty("CAP") @JsonAlias("cap") private String cap; }
- 反序列化时:Jackson会识别外部返回的
cap字段,赋值给cap属性 - 序列化时:Jackson会将
cap属性输出为CAP字段
方案二:用@JsonSetter和@JsonGetter分别控制输入输出
通过@JsonSetter指定反序列化时匹配的字段名,@JsonGetter指定序列化时输出的字段名,实现输入输出分离:
@NoArgsConstructor @Data public class MyObject { @JsonSetter("cap") @JsonGetter("CAP") private String cap; }
@JsonSetter("cap"):告诉Jackson,反序列化时用cap字段的值设置cap属性@JsonGetter("CAP"):告诉Jackson,序列化时将cap属性以CAP字段名输出
方案三:重写getter/setter并分别添加@JsonProperty
如果需要更明确的控制,可以重写Lombok生成的getter和setter,分别在方法上添加@JsonProperty指定不同的字段名:
@NoArgsConstructor @Data public class MyObject { private String cap; @Override @JsonProperty("CAP") public String getCap() { return cap; } @Override @JsonProperty("cap") public void setCap(String cap) { this.cap = cap; } }
- getter上的
@JsonProperty("CAP")控制序列化输出字段名 - setter上的
@JsonProperty("cap")控制反序列化匹配字段名
以上方案均基于Spring Boot默认的JSON处理器Jackson,修改后RestTemplate接收外部{"cap":"98888"}时能正确赋值,自身服务返回的JSON会是{"CAP":"98888"}。
内容的提问来源于stack exchange,提问作者wishyouwerehere
相关产品推荐
相关产品推荐

