Jackson序列化Kotlin数据类时全大写属性JsonProperty注解不生效问题
问题原因分析
- 注解作用目标不匹配:Kotlin数据类主构造参数上声明的
@JsonProperty注解,默认作用目标是构造函数的入参,而Jackson序列化默认优先读取类成员getter方法上的注解,入参上的注解如果没有明确指定作用目标,Jackson无法识别,就会走默认的字段名推导逻辑。 - 默认命名策略的转换干扰: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
相关产品推荐
相关产品推荐

