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

JsonProperty引发属性名定义冲突/歧义问题求助

解决Jackson属性冲突异常(保留ndc和isNdc字段)

问题原因

Jackson 2.17.x+ 结合 Kotlin 2.0.0 时,属性命名检测逻辑更严格:data类val ndc自动生成的getNdc()方法,与自定义的isNdc()方法被默认识别为关联同一个ndc属性,再加上两者标注了不同的@JsonProperty名称,最终触发属性定义冲突异常。

解决方案

方案1:调整属性自动检测规则

通过@JsonAutoDetect指定Jackson仅识别字段和显式标注的getter,忽略自动生成的getter方法:

import com.fasterxml.jackson.annotation.JsonAutoDetect
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonGetter

@JsonAutoDetect(
    getterVisibility = JsonAutoDetect.Visibility.NONE,
    fieldVisibility = JsonAutoDetect.Visibility.ANY
)
data class LotItem(
    @JsonProperty("lotId") val lotId: String? = null,
    @JsonProperty("ndc") val ndc: String? = null,
) {
    @JsonProperty("isNdc")
    @JsonGetter
    fun isNdc(): Boolean {
        return ndc != null
    }
}

方案2:手动控制getter序列化

用@get:JsonIgnore忽略自动生成的getNdc(),手动实现带@JsonProperty的getter,同时保留自定义的isNdc()方法:

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonIgnore

data class LotItem(
    @JsonProperty("lotId") val lotId: String? = null,
    @JsonProperty("ndc") @get:JsonIgnore val ndc: String? = null,
) {
    @JsonProperty("ndc")
    fun getNdc(): String? {
        return ndc
    }

    @JsonProperty("isNdc")
    fun isNdc(): Boolean {
        return ndc != null
    }
}

方案3:全局配置Jackson

在ObjectMapper中禁用USE_GETTERS_AS_SETTERS特性,避免将isXxx()方法关联到xxx属性:

import com.fasterxml.jackson.databind.MapperFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.registerKotlinModule

val objectMapper = ObjectMapper().registerKotlinModule()
    .disable(MapperFeature.USE_GETTERS_AS_SETTERS)

后续使用该配置好的objectMapper进行序列化/反序列化操作即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:53:10