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
相关产品推荐
相关产品推荐

