Jackson objectMapper 为相同的 json 提供不同的对象
Jackson objectMapper gives different object for same json
我正在将 json 传递给 objectmapper。 JSON 字符串如下所示:
{
"id": "ID1",
"identifier" : "XYZ",
"data": [
{
"id": "sampleParentID",
"childrenElements": [
{
"id" : "sampleChildID",
"content" : "sample child content",
}
]
}
]
}
val objectMapper = ObjectMapper().registerModule(KotlinModule())
val obj: Object1 = objectMapper.readValue(jsonString)
我的 class 看起来像这样:
data class Object 1 (
var id : String? = null,
var identifier : String? = null,
var data: MutableList<Element>? = null,
){
// some functions
}
class Element (
var id : String?= null
var content : String? = null
var children: List<Element>? = listOf(),
) {
// som functions
}
从obj开始,数据字段是嵌套的,它本身就是一个对象。
我想获得 data 的 hashCode,所以我做了 obj.data.hashCode()
。假设生成了 12345。
我将其存储在数据库中。现在,假设用户发送另一个具有完全相同 JSON 的请求,JSON 再次转换为一个对象,我从中提取数据字段,现在当我执行 obj.data.hashCode()
, 12345不会生成,而是会生成其他一些数字。
这种行为是预期的吗?如果是,解决方法是什么?
更新:添加了 classes 描述。
鉴于您的 Element
class 不是数据 class(在这种情况下,您将获得基于所有 class 的 hashCode()
方法实现properties)你将需要自己编写 hashCode()
方法,这样默认的方法(基于对象内存引用)就不会被使用,并且你可以摆脱你当前面临的行为。
我正在将 json 传递给 objectmapper。 JSON 字符串如下所示:
{
"id": "ID1",
"identifier" : "XYZ",
"data": [
{
"id": "sampleParentID",
"childrenElements": [
{
"id" : "sampleChildID",
"content" : "sample child content",
}
]
}
]
}
val objectMapper = ObjectMapper().registerModule(KotlinModule())
val obj: Object1 = objectMapper.readValue(jsonString)
我的 class 看起来像这样:
data class Object 1 (
var id : String? = null,
var identifier : String? = null,
var data: MutableList<Element>? = null,
){
// some functions
}
class Element (
var id : String?= null
var content : String? = null
var children: List<Element>? = listOf(),
) {
// som functions
}
从obj开始,数据字段是嵌套的,它本身就是一个对象。
我想获得 data 的 hashCode,所以我做了 obj.data.hashCode()
。假设生成了 12345。
我将其存储在数据库中。现在,假设用户发送另一个具有完全相同 JSON 的请求,JSON 再次转换为一个对象,我从中提取数据字段,现在当我执行 obj.data.hashCode()
, 12345不会生成,而是会生成其他一些数字。
这种行为是预期的吗?如果是,解决方法是什么?
更新:添加了 classes 描述。
鉴于您的 Element
class 不是数据 class(在这种情况下,您将获得基于所有 class 的 hashCode()
方法实现properties)你将需要自己编写 hashCode()
方法,这样默认的方法(基于对象内存引用)就不会被使用,并且你可以摆脱你当前面临的行为。