Spring Boot ObjectMapper为何忽略第二个大写字母?是否为Bug?
Jackson序列化Kotlin字段时大写字母转小写的原因及说明
问题重现
使用Spring Boot 2.7.15版本,通过Jackson2ObjectMapperBuilder(依赖spring-web:5.3.29)创建ObjectMapper,序列化如下Kotlin数据类:
data class SomeClass( val oAuthClientType: String, // 其他字段省略 )
得到的JSON结果为:
{"oauthClientType": "SOME_TYPE"}
疑问:字段名中的第二个大写字母A被转为小写a,这是为什么?属于Bug吗?
原因分析
这不是Bug,是Jackson默认命名策略的预期行为。
Spring Boot默认启用Jackson的PropertyNamingStrategies.LOWER_CAMEL_CASE(驼峰命名策略),其内部的DefaultNameTransformer有一套特定识别规则:当属性名以「小写字母+大写字母」开头时(比如oAuth),会判定这是一个连续的单词而非驼峰分隔的边界,因此会将第二个大写字母转为小写,最终输出oauth。
这种设计是为了兼容行业内常见的特殊命名(比如XMLHttpRequest)——这类名称首字母小写、第二个字母大写,本身是一个完整术语,不应被拆分为驼峰结构。
是否属于Bug?
明确不是Bug,这是Jackson团队为适配实际命名场景特意设计的规则,完全符合预期。
自定义字段名的方案
如果需要保留原字段名的大小写格式,有两种常用实现方式:
- 字段级注解指定:在目标字段上添加
@JsonProperty注解强制指定JSON键名:data class SomeClass( @JsonProperty("oAuthClientType") val oAuthClientType: String, // 其他字段省略 ) - 全局配置自定义命名策略:通过配置类覆盖Jackson的默认命名逻辑:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { return builder .propertyNamingStrategy(new PropertyNamingStrategy() { @Override public String translate(String input) { // 自定义命名转换逻辑,比如直接返回原字段名 return input; } }) .build(); } }
内容的提问来源于stack exchange,提问作者JoonT
相关产品推荐
相关产品推荐

