Kotlin数据类序列化时如何保留字段大小写?
解决Jackson序列化Kotlin数据类时字段大小写丢失的问题
嘿,这个问题我之前在项目里也碰到过!Jackson默认的属性命名策略会悄悄把你首字母大写的字段名转成小写,咱们可以用两种方法快速解决:
方法一:给单个字段指定序列化名称
最简单的方式就是给需要保留大小写的字段加上@JsonProperty注解,明确指定它序列化后的名称:
import com.fasterxml.jackson.annotation.JsonProperty data class Vac ( @JsonProperty("I") // 强制指定输出为大写"I" var I : List<Double>, var v: List<Double> )
这种方法针对性强,适合只需要修改少数字段大小写的场景,改完直接序列化就能得到你想要的{"I":[...], "v":[...]}结果。
方法二:全局配置Jackson保留原始字段名
如果你有很多字段都需要保留原始大小写,可以在初始化ObjectMapper的时候,设置命名策略为IDENTITY——这个策略会完全保留属性的原始名称,不做任何转换:
import com.fasterxml.jackson.databind.PropertyNamingStrategies inline fun<T> serialize(obj: T): String { return ObjectMapper() .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true) .setSerializationInclusion(JsonInclude.Include.NON_NULL) .registerKotlinModule() .setPropertyNamingStrategy(PropertyNamingStrategies.IDENTITY) // 全局启用原样保留命名 .writeValueAsString(obj) }
这样配置后,所有数据类的字段都会按照你定义的大小写输出,不用逐个加注解,适合全局统一需求的场景。
为什么会出现这个问题?
Jackson默认使用LOWER_CAMEL_CASE命名策略,它会根据Kotlin属性的getter方法名推断字段名——比如你的I属性对应的getter是getI(),Jackson会把它解析成小写的i。而IDENTITY策略或者@JsonProperty注解可以绕过这个默认逻辑,强制使用你定义的字段名。
内容的提问来源于stack exchange,提问作者Василий Щербаков




