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

Jackson序列化Kotlin数据类时全大写属性JsonProperty注解不生效问题

问题原因分析
  1. 注解作用目标不匹配:Kotlin数据类主构造参数上声明的@JsonProperty注解,默认作用目标是构造函数的入参,而Jackson序列化默认优先读取类成员getter方法上的注解,入参上的注解如果没有明确指定作用目标,Jackson无法识别,就会走默认的字段名推导逻辑。
  2. 默认命名策略的转换干扰:Jackson默认会根据getter方法名推导JSON字段名,规则是去掉get前缀后将首字母转为小写,你的全大写属性NET_CASH_FLOW对应的getter为getNET_CASH_FLOW(),推导后就得到了net_CASH_FLOW,和你实际得到的异常序列化结果一致。
    当你把属性改为小驼峰命名时,注解匹配逻辑优先级高于默认命名推导,所以@JsonProperty指定的全大写字段名生效。
保留属性名全大写的解决方案

下面给出3种可行方案,按需选择即可:

方案1:明确指定@JsonProperty的作用目标

直接给注解添加get:前缀,明确标注该注解作用于属性的getter方法,优先级最高,不会被全局配置覆盖:

data class SummarizedReturn(
    @get:JsonProperty("NET_CASH_FLOW")
    val NET_CASH_FLOW: BigDecimal,
    @get:JsonProperty("ROI_PERCENTAGE")
    val ROI_PERCENTAGE: BigDecimal
)

方案2:给单个数据类指定命名策略

如果该类的所有字段都需要输出全大写下划线格式,可以直接给类加@JsonNaming注解,不需要给每个属性单独加@JsonProperty:

import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming

@JsonNaming(PropertyNamingStrategies.UpperSnakeCaseStrategy::class)
data class SummarizedReturn(
    val NET_CASH_FLOW: BigDecimal,
    val ROI_PERCENTAGE: BigDecimal
)

方案3:全局配置Jackson命名策略

如果项目所有接口的JSON字段都需要全大写下划线格式,可以直接修改全局Jackson配置,不需要修改任何数据类代码:

  • 如果是SpringBoot项目,在application.yml中添加配置:
spring:
  jackson:
    property-naming-strategy: UPPER_SNAKE_CASE
  • 如果是单独使用Jackson,手动创建ObjectMapper时配置:
val objectMapper = ObjectMapper()
    .setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_SNAKE_CASE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:39:04