【发布时间】:2018-03-17 06:23:03
【问题描述】:
使用 jackson-module-Scala,我尝试使用 Long as key 序列化和反序列化具有内部 Map 的对象,但 Jackson 将密钥序列化为 String 并且不会将其反序列化为如果忽略 Class 中定义的类型,则 Long。 是BUG吗?我做错了吗?
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class InnerMap(map: Map[Long, Long])
object CrazyJackson {
def main(args: Array[String]): Unit = {
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val innerMap = InnerMap(Map(1L->1L))
val serialized = mapper.writeValueAsString(innerMap)
val newObj = mapper.readValue(serialized, classOf[InnerMap])
println(serialized) // Why the key is serialized as a String?
println(innerMap)
println(newObj)
assert(newObj == innerMap)
}
}
断言失败,println(serialized) 语句的输出是:
{"map":{"1":1}}
奇怪的是打印newObj和innerMap是一样的:
InnerMap(Map(1 -> 1))
InnerMap(Map(1 -> 1))
正如@Varren 所说,问题确实出在断言中。但是:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import org.scalatest.FunSuite
class CrazyJacksonTest extends FunSuite {
test("test json comparision") {
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val innerMap = InnerMap(Map(1L->1L))
val serialized = mapper.writeValueAsString(innerMap)
val newObj = mapper.readValue(serialized, classOf[InnerMap])
assert(newObj.map == innerMap.map)
}
}
断言结果:
Map("1" -> 1) did not equal Map(1 -> 1)
ScalaTestFailureLocation: CrazyJacksonTest$$anonfun$1 at (CrazyJacksonTest.scala:17)
Expected :Map(1 -> 1)
Actual :Map("1" -> 1)
我迷路了! 地图必须是 Map[Long,Long]!
由于 Spark 依赖,我必须使用这个版本:
- Scala 2.11.11
- jackson-module-scala 2.6.5 并使用 2.9.1 版本进行测试,结果相同。
其他信息:
【问题讨论】:
标签: json scala serialization jackson circe