0

我正在使用 Restlet 调用返回 JSON 对象数组的 API。当进行类似的调用以拉回单个对象时,所有内容都正确映射到自定义类,但是当我拉回数组时,对象被映射为 LinkedHashMap 而不是此自定义对象。我确定我只需要定义如何正确反序列化数组,但我还没有弄清楚如何做到这一点。

@Get("json")
public Trait getTrait();

@Get("json")
public HashSet<Trait> getTraits();

前者工作正常,但后者不起作用。最终,当我尝试遍历 HashSet 时,我会出现此错误:java.util.LinkedHashMap 无法转换为 com.test.traits.Trait。

任何帮助,将不胜感激。

4

1 回答 1

2

这通常是因为类型是作为类(like HashSet)而不是泛型类型(HashSet<Trait>)传递的。如果是这样,这相当于HashSet<Object>, 杰克逊别无选择,只能将内容绑定到最简单的可用 Object 类型,该类型匹配只是java.util.Collection某种类型。

听起来 Restlet 出于某种原因没有正确传递泛型类型信息。

有解决方法:

  • 使用包装器对象,以便Lists 和Maps 始终是 Java 对象的属性,而不是根级别的值。这确保了类型工作,即使 Restlet 没有为根值传递泛型类型
  • 子类HashSet,使您具有非泛型类型;杰克逊然后可以找出泛型类型HashSet

对于第二种情况,您只需执行以下操作:

public class MyTraits extends HashSet<Trait> { }

@Get("json")
public MyTraits getTraits();

它会起作用,因为MyTraits它没有自己的泛型类型;但它的超类型声明具有可供 Jackson 使用的通用参数。

于 2012-10-21T01:06:36.827 回答