杰克逊用泛型反序列化

时间:2016-11-12 09:52:23

标签: 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}]} 

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

{ "results":[{"b":1},{"b":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元素数组结果的类。

我在这里做错了什么?我认为这是库中的一个错误

问候。

1 个答案:

答案 0 :(得分:3)

原因是java.lang.Class不包含有关通用参数的信息。 classOf[Result[Aclass]]的值是java.lang.Class。它没有关于类型参数Aclass的信息。它仅代表Results类。

映射器可以满足您的要求:为您提供Results的任何内容以及最好的地图。

要解决此问题,请使用需要JavaType的readValue方法。可以使用JavaType

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