gpt4 book ai didi

java - Jackson 中的(反)序列化嵌套泛型

转载 作者:行者123 更新时间:2023-12-01 22:55:24 28 4
gpt4 key购买 nike

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

List<T>

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

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

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

一个省略 getters/setters/constructors 的简单示例:

class A {
String name;
B thing;
}

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

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

我想编写一个 Jackson 命令来一次性序列化 A。我一直在使用A附的方法:

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

但这有一个已知的问题,即泛型集合会丢失其类型信息并且不可反序列化。

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

最佳答案

当 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序列化/反序列化。

关于java - Jackson 中的(反)序列化嵌套泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24143440/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com