无法将具有一个字段的 json 序列化为 Map<String, Double>

问题描述 投票:0回答:1

我有以下 kotlin 类:

data class MyClass(private val myMap: Map<String, Double>, val defaultValue: Double)

我反序列化它(将其从 json 字符串转换为 Kotlin 类)没有问题,但是当我尝试序列化它(从 Kotlin 类到 json 字符串)时,它对属性

myMap
不起作用。

这是一个测试示例:

private val objectMapper: ObjectMapper = jacksonObjectMapper().findAndRegisterModules()

@Test
fun serializing() {
    val myClass = MyClass(mapOf(Pair("user1",1.0), Pair("user2", 2.0)), defaultPoints = 1.0)

    val myMapObject = JSONObject()
    myMapObject .put("user1",1)
    myMapObject .put("user2",2)
    val expected= JSONObject()
    expected.put("myMap", myMapObject)
    expected.put("defaultPoints", 1)
    val actual = JSONObject(this.objectMapper.writeValueAsString(pointCalculator))

    assertEquals(expected, actual)
}

但是实际json中的json字段

myMap
是空的(这就是我得到的:
{"defaultPoints":1}
)。

我错过了什么吗?

json kotlin jackson
1个回答
0
投票

如果您的目标是获取 Kotlin 对象,序列化为字符串,然后将其反序列化回此往返有效的对象和资产,那么您不需要

JSONObject
。 实际的错误(如@Tim Roberts)所说是由于
private
字段上的
myMap
修饰符造成的。 默认情况下,Jackson 将查找公共 getter,而不是使用直接字段访问,因此它看不到
myMap
字段。

此代码有效:

data class MyClass(val myMap: Map<String, Double>, val defaultPoints: Double)
private val objectMapper: ObjectMapper = jacksonObjectMapper().findAndRegisterModules()

@Test
fun serializing() {
    val myClass = MyClass(mapOf(Pair("user1",1.0), Pair("user2", 2.0)), defaultPoints = 1.0)
    val json = objectMapper.writeValueAsString(myClass)
    println(json)
    val myClassRoundTrip = objectMapper.readValue(json, MyClass::class.java)
    assertEquals(myClass, myClassRoundTrip)
}

然后打印出来

{"myMap":{"user1":1.0,"user2":2.0},"defaultPoints":1.0}
© www.soinside.com 2019 - 2024. All rights reserved.