当前位置: 首页 > 知识库问答 >
问题:

基于存在唯一属性,使用Jackson反序列化多态类型

拓拔泉
2023-03-14

如果我有一个像这样的类结构:

java prettyprint-override">public abstract class Parent {
    private Long id;
    ...
}

public class SubClassA extends Parent {
    private String stringA;
    private Integer intA;
    ...
}

public class SubClassB extends Parent {
    private String stringB;
    private Integer intB;
    ...
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "objectType")

我宁愿不必强制API的客户端包含“objectType”:“subclassa”来反序列化子类。

不使用@jsontypeinfo,Jackson是否提供了一种方法来注释子类并通过唯一的属性将其与其他子类区分开来?在上面的示例中,这将类似于“如果一个JSON对象具有”stringA“:...反序列化它为subclassA,如果它具有”stringB“:...反序列化它为subclassB”。

共有1个答案

邹普松
2023-03-14

这感觉像是应该使用@jsonTypeInfo@jsonSubtypes的东西,但我在文档中进行了筛选,没有一个可以提供的属性与您描述的完全匹配。

您可以编写一个自定义的反序列化器,它以非标准的方式使用@jsonsubtypes'“name”和“value”属性来完成您想要的任务。反序列化器和@jsonsubtypes将提供给基类,反序列化器将使用“name”值检查属性是否存在,如果存在,则将JSON反序列化到“value”属性中提供的类中。然后,您的类看起来如下所示:

@JsonDeserialize(using = PropertyPresentDeserializer.class)
@JsonSubTypes({
        @Type(name = "stringA", value = SubClassA.class),
        @Type(name = "stringB", value = SubClassB.class)
})
public abstract class Parent {
    private Long id;
    ...
}

public class SubClassA extends Parent {
    private String stringA;
    private Integer intA;
    ...
}

public class SubClassB extends Parent {
    private String stringB;
    private Integer intB;
    ...
}
 类似资料:
  • 问题内容: 如果我有这样的类结构: 还有另一种反序列化的方法吗?在父类上使用此注释: 我不想强迫我的API的客户包括反序列化一个子类。 杰克逊不是使用,而是提供了一种方法来注释子类并通过唯一属性将其与其他子类区分开来?在上面的示例中,这类似于“如果JSON对象将其反序列化为,如果它将其反序列化为”。 问题答案: 感觉像是应该使用的东西,但是我在文档中进行了选择,可以提供的任何属性似乎都不符合您所描

  • 我正在使用JacksonPolymorphicDeserialization,这是我的代码,它反序列化到基于“type”属性的适当类中: 它工作得很好,我的json根据“type”值变成了预期的类。 但是,我正在考虑将“type”属性从String移动到Enum,这是我的新代码,带有以下更改: 和枚举: 问题是,第二种方法不起作用。。。知道为什么吗???我可以在这里使用Enum吗??? 谢谢!

  • 我的JSON字符串是: 我想要实现的是,当JSON中没有提供schemaVersion时,能够在默认情况下反序列化到SubClassV1,但即使在Superclass中将schemaVersion初始化为“1.0”时,我仍然会收到以下错误:

  • 我们有以下Json: 我们需要根据type属性将这些项以多态方式反序列化为不同的子类。 在自定义Jackson反序列化程序中是否可以获取类型值? 我们可以使用提供给反序列化方法的JsonParser安全地回溯Json树吗? 我发现了这篇关于多态反序列化的博客,但它似乎需要在项目本身上设置一个type属性。 谢谢

  • 我看过jackson反序列化@JsonTypeInfo的一个例子,那就是: 我试过了,效果很好。现在的问题是,在示例类中,Cat和Dog是从Animal中引用的,我想避免这种情况。有没有一种方法可以将类型绑定从类动物中移除,并且仍然进行反序列化工作?谢谢