我有以下 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}
)。
我错过了什么吗?
如果您的目标是获取 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}