如何通过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配置实现:
- 先去掉接口方法上硬编码的
@JsonProperty注解,让字段命名跟随全局策略:
public interface IActionData { String getDataType(); String getNumber(); String getFoo(); }
- 自定义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
相关产品推荐
相关产品推荐

