json - 我是否刚刚通过使用 Jackson JSON 反序列化破坏了 JAVA 类型安全?

标签 json scala jvm type-safety jackson-module-scala

这就是我得到的:

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/

相关文章:

java - Apache Camel - 向路由发送消息后的响应

java - Hadoop facebook 共同的 friend 使用 mapreduce

function - 为什么( self : Runnable =>) in scala compiles?

scala - scala方法参数的java注释

java - 如果在 HotSpot JVM 中启用了偏向锁定,对象的哈希码存储在哪里?

java - Java 基类中的私有(private)方法的动态绑定(bind)如何工作?

android - 在 Android 中改造没有值(value)的 GET

java - A 类声明了多个 JSON 字段

scala - 使用前移除 Spark RDD block

java - 运行java bat文件时出错