我试图将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元素数组结果的类。
我在这里做错了什么?我认为这是库中的一个错误
问候。
答案 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]))