我正在使用Restlet来调用返回JSON对象数组的API。当进行类似的调用以撤回单个对象时,所有内容都会正确映射到自定义类,但是当我拉回数组时,Object将被映射为LinkedHashMap而不是此自定义对象。我确定我只需要定义如何正确反序列化数组,但我还没弄清楚到底是怎么做的。
@Get("json")
public Trait getTrait();
@Get("json")
public HashSet<Trait> getTraits();
前者工作正常,但后者不起作用。最后,当我尝试遍历HashSet时,我可以发出以下错误:java.util.LinkedHashMap无法强制转换为com.test.traits.Trait。
任何帮助都将不胜感激。
答案 0 :(得分:2)
这通常是因为类型是作为类(如HashSet
)而不是泛型类型(HashSet<Trait>
)传递的。如果是这样,这相当于HashSet<Object>
,杰克逊别无选择,只能将内容绑定到最简单的对象类型,该类型匹配的只是某种类型的java.util.Collection
。
听起来Restlet由于某种原因没有正确传递泛型类型信息。
有解决办法:
List
和Map
始终是Java对象的属性,而不是根级别的值。即使Restlet没有为根值传递泛型类型HashSet
,以便您具有非泛型类型;杰克逊可以找出HashSet
对于第二种情况,您只需执行以下操作:
public class MyTraits extends HashSet<Trait> { }
和
@Get("json")
public MyTraits getTraits();
它会起作用,因为MyTraits
没有自己的通用类型;但它的超类型声明具有杰克逊可用的通用参数。