使用Jackson库在派生类中修改JSON属性名
解决Spring REST API中派生类自定义父类属性序列化名称的问题
嘿,这个需求我之前在项目里也碰到过,其实有几个实用的方案能实现派生类单独重写父类属性的序列化名称,不用全局修改,咱们一步步来看:
方法一:重写子类的Getter方法并添加@JsonProperty
这是最直接的方案,不需要额外配置,只需要在需要修改属性名的子类里重写父类的Getter方法,然后在重写的方法上加上自定义的@JsonProperty注解即可。
首先是你的基类BaseResponse:
public class BaseResponse { private String requestUuid; // 基础的Getter和Setter,不带JsonProperty注解 public String getRequestUuid() { return requestUuid; } public void setRequestUuid(String requestUuid) { this.requestUuid = requestUuid; } }
然后,对于需要将requestUuid序列化为request_uuid的子类(比如SnakeCaseApiResponse),我们重写它的Getter方法:
public class SnakeCaseApiResponse extends BaseResponse { // 其他子类特有的字段... @Override @JsonProperty("request_uuid") public String getRequestUuid() { // 调用父类的Getter获取值,避免重复维护字段导致数据不一致 return super.getRequestUuid(); } }
而不需要修改属性名的子类(比如CamelCaseApiResponse)直接继承基类即可,序列化时会默认使用requestUuid作为属性名。
方法二:使用Jackson MixIn实现无侵入修改
如果你的子类很多,或者不想修改子类的代码,可以用Jackson的MixIn功能来动态给特定类添加注解配置,实现无侵入的属性名修改。
首先定义一个MixIn接口,指定我们想要的属性名:
public interface SnakeCaseBaseResponseMixIn { @JsonProperty("request_uuid") String getRequestUuid(); }
然后在Spring的配置类里,给需要修改的子类注册这个MixIn:
@Configuration public class JacksonCustomConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 给需要蛇形命名的子类绑定MixIn objectMapper.addMixIn(SnakeCaseApiResponse.class, SnakeCaseBaseResponseMixIn.class); return objectMapper; } }
这样,当Spring序列化SnakeCaseApiResponse时,会自动使用MixIn里定义的request_uuid作为属性名,其他子类不受任何影响。
小提示
- 方法一中,重写Getter时一定要调用
super.getRequestUuid(),避免自己维护字段导致数据不一致。 - 方法二中,如果有多个子类需要统一蛇形命名,可以一次性给多个类注册MixIn,不过要注意范围,避免误影响其他类。
内容的提问来源于stack exchange,提问作者Melad Basilius
相关产品推荐
相关产品推荐

