【问题标题】:Deserializing JSON Array of Object Using Restlet/Jackson使用 Restlet/Jackson 反序列化 JSON 对象数组
【发布时间】:2012-10-20 22:45:56
【问题描述】:

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

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

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

前者工作正常,但后者不工作。最终,当我尝试遍历 HashSet 时,会出现此错误:java.util.LinkedHashMap cannot be cast to com.test.traits.Trait。

任何帮助将不胜感激。

【问题讨论】:

    标签: json rest jackson restlet


    【解决方案1】:

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

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

    有解决方法:

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

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

    public class MyTraits extends HashSet<Trait> { }
    

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

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

    【讨论】:

    • 后者有效。我实际上已经尝试过,但我的新系列也有泛型。一旦我把它拿出来,一切正常。
    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2020-07-21
    • 2019-02-07
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多