You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:45:41