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

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团队为适配实际命名场景特意设计的规则,完全符合预期。

自定义字段名的方案

如果需要保留原字段名的大小写格式,有两种常用实现方式:

  1. 字段级注解指定:在目标字段上添加@JsonProperty注解强制指定JSON键名:
    data class SomeClass(
      @JsonProperty("oAuthClientType")
      val oAuthClientType: String,
      // 其他字段省略
    )
    
  2. 全局配置自定义命名策略:通过配置类覆盖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:20:26