Jackson ObjectMapper反序列化相同JSON时data字段hashCode不一致问题
问题原因
该行为符合预期,核心原因如下:
- 你定义的
Element是普通Kotlin类而非data class,Kotlin中普通类默认的hashCode()方法基于对象的内存地址计算,每次反序列化都会生成新的内存实例,即使所有属性值完全相同,不同实例的hashCode也必然不同。 - 你所使用的
MutableList的hashCode()是基于容器内元素的hashCode聚合计算的,内层Element实例的hashCode不稳定,直接导致外层data字段的hashCode每次计算结果不一致。 - 额外存在字段映射不匹配问题:JSON中嵌套子节点的键为
childrenElements,但Element类中对应的字段名为children,如果未配置对应注解或Jackson未关闭未知字段报错开关,会导致children字段反序列化后值为空,也会干扰hashCode计算结果。
解决方案
按以下步骤调整即可保证相同输入下hashCode计算结果一致:
- 将
Element改为data class,Kotlin会自动基于类的所有属性生成equals()和hashCode()方法,只要属性值完全相同,实例的hashCode就会保持一致:
data class Element ( var id : String?= null, var content : String? = null, @JsonProperty("childrenElements") // 匹配JSON中的字段名 var children: List<Element>? = listOf(), ) { // 自定义方法 }
- 如果你不希望使用
data class,也可以手动重写Element类的equals()和hashCode()方法,基于业务需要的属性进行计算即可。 - 可选优化:如果后续不需要修改
data字段的内容,可将Object1中的data字段类型从MutableList改为不可变List,避免后续误改内容导致hashCode发生变化。
内容的提问来源于stack exchange,提问作者Kancha
相关产品推荐
相关产品推荐

