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

Jackson ObjectMapper反序列化相同JSON时data字段hashCode不一致问题

问题原因

该行为符合预期,核心原因如下:

  1. 你定义的Element是普通Kotlin类而非data class,Kotlin中普通类默认的hashCode()方法基于对象的内存地址计算,每次反序列化都会生成新的内存实例,即使所有属性值完全相同,不同实例的hashCode也必然不同。
  2. 你所使用的MutableList的hashCode()是基于容器内元素的hashCode聚合计算的,内层Element实例的hashCode不稳定,直接导致外层data字段的hashCode每次计算结果不一致。
  3. 额外存在字段映射不匹配问题:JSON中嵌套子节点的键为childrenElements,但Element类中对应的字段名为children,如果未配置对应注解或Jackson未关闭未知字段报错开关,会导致children字段反序列化后值为空,也会干扰hashCode计算结果。

解决方案

按以下步骤调整即可保证相同输入下hashCode计算结果一致:

  1. 将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(),
) {
    // 自定义方法
}
  1. 如果你不希望使用data class,也可以手动重写Element类的equals()和hashCode()方法,基于业务需要的属性进行计算即可。
  2. 可选优化:如果后续不需要修改data字段的内容,可将Object1中的data字段类型从MutableList改为不可变List,避免后续误改内容导致hashCode发生变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:02