【问题标题】:(de)serialising Nested Generics in Jackson(反)序列化杰克逊中的嵌套泛型
【发布时间】:2014-06-10 14:20:33
【问题描述】:

所以我正在寻求使用 Jackson 反序列化和序列化对象。对象具有层次结构,在层次结构的深处有一个

List<T>

其中 T 是一个字符串,或者是 Java 数字类之一。

反序列化通用列表一直是这些论坛上的一个常见话题,我知道如何构建一个映射器,该映射器将使用 mapper.readValue 反序列化或序列化列表。

我不知道该怎么做是这样,当我在顶层调用映射器时,它不明确知道它包含的类的参数化,这样它就知道如何当它到达包含参数化列表的底层类时调用自定义反序列化器。

省略了 getter/setter/constructors 的简单示例:

class A {
    String name;
    B thing;
}

class B {
    String command;
    List<C<?>> conditions;
}

class C<T> {
    String type;
    List<T> parameters
}

我想写一个杰克逊命令,一次性序列化 A。我一直在使用附加到A的方法:

public String toJSON() throws JsonProcessingException{
    ObjectMapper mapper = new ObjectMapper();
    mapper.enableDefaultTyping();
    return mapper.writeValueAsString(this);
}

但这存在泛型集合丢失其类型信息且不可反序列化的已知问题。

我可以使用建议here 来反序列化具有通用参数的给定类,但我不知道如何组合这些解决方案。我希望 Jackson 有一些我可以为 C 编写自定义反序列化器的东西,它可以在达到该类类型时使用它,否则它可以使用普通的序列化器,这对于其他类来说很好。

【问题讨论】:

  • 尝试更好地使用 Gson 库..
  • @sercan 向我们展示你所拥有的所有客观证据。
  • 如果有人在 Gson 中提出这个问题的解决方案,我会很乐意使用它.... 立即阅读他们的用户指南。
  • @SercanOzdemir 如果您建议使用不同的库,您至少可以尝试解释这将如何提供帮助;否则你只是派 OP 去打野鹅。
  • 很抱歉,但我没有足够的时间来测试并写到这里。但我可以给你一个链接,告诉你如何使用 GSON 自定义序列化/反序列化,这是其中一个 javacreed.com/gson-serialiser-example

标签: java json serialization jackson deserialization


【解决方案1】:

当 Jackson 将您的 JSON 反序列化为 A 类型的对象时,它会在反序列化其 B 字段时看到以下内容

List<C<?>> conditions;

您(程序员)和 Jackson 都不知道 Cparameters 字段应该有什么类型。因此,它没有足够的信息来反序列化,就像你想要的那样。相反,它将使用我认为是LinkedHashMap(或类似的东西)的默认类型。

基本上,您唯一的选择是给它提示。 (自定义)使用要反序列化到的 ClassString 值序列化对象层次结构。然后,您可以在自定义反序列化器中为每种类型制定不同的策略。

由于您只有几种类型,StringNumber 类之一,您最好为每种类型编写一个泛型类 C 和 X 个非泛型类

class C<T> {}
class StringC extends C<String> {}
class IntegerC extends C<Integer> {}

并使用一些polymorphic type handling 来序列化/反序列化。

【讨论】:

  • 这很奏效。它既快速又简单,几乎不需要额外的工作。 :)
  • 是的,它是一个链接的哈希图,我浪费了一整天的时间来弄清楚这个 LinkedHashMap 转换错误到我的实际泛型类型的来源。
猜你喜欢
  • 2012-12-22
  • 2019-11-15
  • 2021-10-02
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2016-12-07
  • 2015-04-07
相关资源
最近更新 更多