You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,提问作者Василий Щербаков

火山引擎 最新活动