json使用Scala、Jackson和java对泛型类型进行奇怪的反序列化问题。整型或scala。Int
我们都知道,在Java和Scala下,泛型类型会受到类型擦除的影响。但是我们在使用Jackson和Scala-Jackson模块时遇到了一个奇怪的问题
我创建了一个小测试来说明这个问题
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
object GenericTest {
case class TestWithInt(id: Option[Int])
case class TestWithInteger(id: Option[Integer])
def main(args: Array[String]) {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
// Test with scala's Int
val test = mapper.readValue[TestWithInt]("""{ "id" : 5 }""", classOf[TestWithInt])
print("Test 1: ")
println(test.id.get + 1)
val test2 = mapper.readValue[TestWithInt]("""{ "id" : "5" }""", classOf[TestWithInt])
print("Test 2: ")
try {
println(test2.id.get + 1)
} catch {
case e: ClassCastException => println(e.getMessage)
}
// Test with java.lang.Integer
val test3 = mapper.readValue[TestWithInteger]("""{ "id" : 5 }""", classOf[TestWithInteger])
print("Test 3: ")
println(test3.id.get + 1)
val test4 = mapper.readValue[TestWithInteger]("""{ "id" : "5" }""", classOf[TestWithInteger])
print("Test 4: ")
println(test4.id.get + 1)
}
}
上面的输出是:
Test 1: 6
Test 2: java.lang.String cannot be cast to java.lang.Integer
Test 3: 6
Test 4: 6
这种不同的行为从何而来?泛型擦除,Jackson,Jackson Scala模块
# 1 楼答案
这似乎是因为
java.lang.Integer
有一个接受字符串的constructor,它允许反序列化程序将该字符串用于Integer
,而Int
的情况并非如此# 2 楼答案
这是一个非常普遍的问题,我为此写了一篇FAQ:
对于好奇的人来说,FAQ中有更多的细节