使用Restlet / Jackson反序列化JSON对象数组

时间:2012-10-20 22:45:56

标签: json rest jackson restlet

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

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

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

前者工作正常,但后者不起作用。最后,当我尝试遍历HashSet时,我可以发出以下错误:java.util.LinkedHashMap无法强制转换为com.test.traits.Trait。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

有解决办法:

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

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

public class MyTraits extends HashSet<Trait> { }

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

它会起作用,因为MyTraits没有自己的通用类型;但它的超类型声明具有杰克逊可用的通用参数。