这就是我得到的:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModuleobject
AppStart extends App {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val json = """{"id":"AB","stuff":"whatever"}"""
val obj = mapper.readValue(json, classOf[TestClass])
println(obj.id.get) // prints AB !!!
}
case class TestClass(id: Option[Int] = None, stuff: Option[String] = None)
同时,这甚至无法构建:
val bad: Option[Int] = "AB"
这里显然有问题。我在项目中使用的版本:
scala版本:=“2.11.6”
libraryDependency += "com.fasterxml.jackson.module"% "jackson-module-scala_2.11"% "2.7.3"
最佳答案
不,这不会破坏JVM类型安全。 JVM不支持泛型,就其而言,id
的类型是Option
,而不是Option[Int]
。要破坏类型安全,您必须获取一个 TestClass
,其 id
不是 Option
。
反射和转换肯定会破坏 Java 和 Scala 的类型安全性,而且它们也应该这样做。
要在 Jackson 中正确反序列化泛型,您需要提供其他信息(请参阅 http://wiki.fasterxml.com/JacksonFAQ#Deserializing_Generic_types ),并且 jackson-module-scala 允许 Scala 编译器提供它:
You can also mixin ScalaObjectMapper (experimental) to get rich wrappers that automatically convert scala manifests directly into TypeReferences for Jackson to use:
val mapper = new ObjectMapper() with ScalaObjectMapper mapper.registerModule(DefaultScalaModule) val myMap = mapper.readValue[Map[String,Tuple2[Int,Int]]](src)
我不知道它是否会自动防止您遇到的问题。
关于json - 我是否刚刚通过使用 Jackson JSON 反序列化破坏了 JAVA 类型安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37268288/