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

如何通过Jackson注解让JsonTypeInfo的property同时支持驼峰和蛇形命名?

无法仅通过@JsonTypeInfo单个注解直接实现双命名格式的适配,以下是两种常用的可行方案:

方案1:仅用注解实现反序列化双格式兼容(最简方案)

该方案无需修改全局配置,即可满足反序列化时同时识别data_type(蛇形)和dataType(驼峰)的需求,代码改动量最小:

  • 仅需在getDataType方法上新增@JsonAlias注解配置驼峰别名即可,修改后的完整代码如下:
@JsonTypeInfo(
  use = Id.NAME,
  include = As.EXISTING_PROPERTY,
  property = "data_type",
  visible = true,
  defaultImpl = ActionDataImpl.class)
@JsonSubTypes(value = {
  @JsonSubTypes.Type(value = LogActionDataImpl.class, name = "LogActionData")
})
public interface IActionData {

  @JsonProperty("data_type")
  @JsonAlias("dataType") // 新增该行,反序列化时可同时识别驼峰格式的dataType字段
  String getDataType();

  String getNumber();

  String getFoo();
}
  • 说明:序列化时默认输出蛇形的data_type,如果需要序列化输出驼峰格式,只需将@JsonProperty值和@JsonTypeInfo的property值都改为dataType即可。
方案2:全局配置实现序列化+反序列化双格式自动适配

如果需要灵活切换序列化输出的命名格式,同时反序列化兼容两种输入格式,可以通过自定义ObjectMapper配置实现:

  1. 先去掉接口方法上硬编码的@JsonProperty注解,让字段命名跟随全局策略:
public interface IActionData {
  String getDataType();
  String getNumber();
  String getFoo();
}
  1. 自定义ObjectMapper配置:
ObjectMapper mapper = new ObjectMapper();
// 配置全局命名策略,需要蛇形输出填SNAKE_CASE,需要驼峰输出填LOWER_CAMEL_CASE
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
// 自定义注解解析器,让JsonTypeInfo的property也跟随全局命名策略自动转换
mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
    @Override
    public PropertyName findTypeNamePropertyName(Annotated ann) {
        PropertyName originalName = super.findTypeNamePropertyName(ann);
        if (originalName == null || mapper.getPropertyNamingStrategy() == null) {
            return originalName;
        }
        String convertedName = mapper.getPropertyNamingStrategy().nameForGetterMethod(null, null, originalName.getSimpleName());
        return PropertyName.construct(convertedName);
    }
});
// 可选:开启全局反序列化自动适配驼峰/蛇形,所有字段无需单独配置@JsonAlias(Jackson 2.13+版本支持)
mapper.enable(DeserializationFeature.ACCEPT_SNAKE_CASE);
注意事项
  • Jackson 2.12以下版本不支持DeserializationFeature.ACCEPT_SNAKE_CASE配置,低版本场景优先使用方案1,兼容性更好。
  • 若仅需要反序列化兼容两种命名格式,方案1完全满足需求,对现有业务逻辑影响最小。

内容的提问来源于stack exchange,提问作者beyonddc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:24:03