有了这个jackson-module-scala
包装
object Json {
private val ma = new ObjectMapper with ScalaObjectMapper
ma.registerModule(DefaultScalaModule)
ma.setSerializationInclusion(Include.NON_NULL)
def jRead[T: Manifest](value: String): T = ma.readValue[T](value)
def jWrite(value: Any) = ma.writer.writeValueAsString(value)
def jNode(value: String) = ma.readTree(value)
}
我尝试阅读子类型(这只是没有实际工作的简化用例):
object TestJTrait extends App {
trait T1
object TestJ { def apply[X <: T1: Manifest](s: String): X = jRead[X](s) }
case class C1(i: Int) extends T1
TestJ(jWrite(C1(42)))
}
但是这种尝试会导致错误:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate abstract type [simple type, class scala.runtime.Nothing$] (need to add/enable type information?)
at [Source: {"i":42}; line: 1, column: 2]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.deser.std.ThrowableDeserializer.deserializeFromObject(ThrowableDeserializer.java:73)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2160)
at com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper$class.readValue(ScalaObjectMapper.scala:180)
任何人都可以建议一种解决方法来获得预期的行为吗?