Scala Jackson使用泛型反序列化

Scala Jackson使用泛型反序列化,scala,jackson,Scala,Jackson,我正在尝试将json反序列化到scala类中,该类包含Aclass、Bclass或Cclass类型的集合 class Results[M](results:util.ArrayList[M]) { def getResults:util.ArrayList[M]=results def this() { this(new util.ArrayList()) } } Json看起来像: { "results":[{"a":1},{"a":1}]} 或 或 这里是我的对

我正在尝试将json反序列化到scala类中,该类包含Aclass、Bclass或Cclass类型的集合

class Results[M](results:util.ArrayList[M]) {

  def getResults:util.ArrayList[M]=results

  def this() {
    this(new util.ArrayList())
  }
}
Json看起来像:

{ "results":[{"a":1},{"a":1}]} 

这里是我的对象映射器

  val mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
下面是我如何反序列化Aclass类类型的json

val results = mapper.readValue(json, classOf[Results[Aclass]])
问题是,返回一个ArrayList,其中每个元素都是Aclass的实例,而不是
LinkedHashMap

如果我将代码改为使用泛型,我会使它在类型中显式

class Results[Aclass](results:util.ArrayList[Aclass]) {

  def getResults:util.ArrayList[Aclass]=results

  def this() {
    this(new util.ArrayList())
  }
}
它工作并返回一个包含Aclass元素数组结果的类

我做错了什么?。我认为这是图书馆里的一个错误


关于。

原因是
java.lang.Class
不包含有关泛型参数的信息。
classOf[Result[Aclass]
的值是java.lang.Class。它没有关于类型参数
Aclass
的信息。它只表示
结果

地图绘制者会按照您的要求进行:为您提供
结果
,以及最好的地图

要解决这个问题,请使用readValue方法,该方法采用
JavaType
JavaType
可以使用
TypeFactory
创建:

val results:Results[Aclass] = mapper.readValue(json, mapper.getTypeFactory()
        .constructParametricType(classOf[Results[_]], classOf[Aclass]))

原因是
java.lang.Class
不包含有关泛型参数的信息。
classOf[Result[Aclass]
的值是java.lang.Class。它没有关于类型参数
Aclass
的信息。它只表示
结果

地图绘制者会按照您的要求进行:为您提供
结果
,以及最好的地图

要解决这个问题,请使用readValue方法,该方法采用
JavaType
JavaType
可以使用
TypeFactory
创建:

val results:Results[Aclass] = mapper.readValue(json, mapper.getTypeFactory()
        .constructParametricType(classOf[Results[_]], classOf[Aclass]))

您是否坚持使用jackson,或者您是否也可以使用一个非基于反射的库(例如circe或argonaut)?如果不需要太多代码并实现我想要的,您完全可以使用新库。但不管怎样,我还是设法使用TypeFactory使它工作起来,但仍然不太满意我的解决方案看起来有多复杂。你是坚持使用jackson还是也可以使用一个不基于反射的库(例如circe或argonaut)?如果不需要太多代码并实现我想要的,完全可以使用新库。但无论如何,我设法使用TypeFactory使其工作,但仍然不太高兴我的解决方案看起来如此复杂,好像它什么都不能反序列化。java.lang.ClassCastException:politrons.apple.search.model.Results无法强制转换到scala.runtime。没有任何$Sorry,忘记将类型声明添加到val结果。如果没有它,则会将的类型推断为Nothing,这在运行时显然是不正确的。这是由于readValue方法的此重载的unbound type参数造成的。我刚刚更新了答案。最后我得到了另一个解决方案,使用Play json,但谢谢!似乎它什么都不能反序列化。java.lang.ClassCastException:politrons.apple.search.model.Results无法强制转换到scala.runtime。没有任何$Sorry,忘记将类型声明添加到val结果。如果没有它,则会将的类型推断为Nothing,这在运行时显然是不正确的。这是由于readValue方法的此重载的unbound type参数造成的。我刚刚更新了答案。最后我得到了另一个解决方案,使用Play json,但谢谢!
val results:Results[Aclass] = mapper.readValue(json, mapper.getTypeFactory()
        .constructParametricType(classOf[Results[_]], classOf[Aclass]))