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

允许缺少反序列化属性的jackson多态反序列化

梁楷
2023-03-14
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "superClassProperty",
    "schemaVersion"
})
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "schemaVersion")
@JsonSubTypes({
    @JsonSubTypes.Type(value = SubClassV1.class, name = "1.0"),
    @JsonSubTypes.Type(value = SubClassV2.class, name = "2.0"),
})
public class SuperClass {
    @JsonProperty("superClassProperty")
    private String superClassProperty;
    @JsonProperty("schemaVersion")
    private String schemaVersion = "1.0";

    @JsonProperty("superClassProperty")
    public String getSuperClassProperty() {
        return superClassProperty;
    }
    @JsonProperty("superClassProperty")
    public void setSuperClassProperty(String superClassProperty) {
        this.superClassProperty = superClassProperty;
    }

    @JsonProperty("schemaVersion")
    public String getSchemaVersion() {
        return schemaVersion;
    }

    @JsonProperty("schemaVersion")
    public void setSchemaVersion(String schemaVersion) {
        this.schemaVersion = schemaVersion;
    }   
}

public class SubClassV1 extends SuperClass {

    @JsonProperty("property1")
    private String property1;

    @JsonProperty("property1")
    public String getProperty1() {
        return this.property1;
    }

    @JsonProperty("property1")
    public void setProperty1(String var1) {
        this.property1 = var1;
    }

    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
}

public class SubClassV1 extends SuperClass {

    @JsonProperty("property2")
    private String property2;

    @JsonProperty("property2")
    public String getProperty2() {
        return this.property2;
    }

    @JsonProperty("property2")
    public void setProperty2(String var2) {
        this.property2 = var2;
    }

    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
}

我的JSON字符串是:

{
    "superClassProperty":"testValue",
    "property1":"property1"
}

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

共有1个答案

呼延英奕
2023-03-14

似乎可以使用JsonTypeInfo的defaultImpl属性。

 类似资料:
  • 我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。 我的基本类看起来像: ...和一个派生自的类: ... 我试图执行以下代码: String是: 但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它

  • 我正在尝试为接受JSON输入的前端库创建一个java SDK。本质上,此SDK将特定类型的对象转换为JSON,然后由前端库使用。 我正在使用杰克逊的多态序列化/反序列化使用它的注释系统。 我有一个基类a和扩展a的两个子类B和C。类a有一个类型字段,我用它来决定要使用哪个类(B或C)。语法如下所示: 现在,当我使用Jackson的ObjectMapper函数读取字符串化的JSON并转换为类A时,我根

  • 我想为我们的REST API实现一个自定义的反序列化器,它不仅被Java应用程序使用。因此,我不想让Jackson将类型信息放入序列化的JSON中。 我目前正在努力反序列化<code>CollectionExpand</code>,因为它包含特定<code>ResourceModel</code>的<code>数据</code>列表。 < code>ResourceModel是一个接口,每个< c

  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器

  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 我有以下几个类,我想使用Jackson反序列化JSON字符串。 PushNotificationMessage.java 设备信息。Java语言 IOSDeviceInfo。Java语言 WebDeviceInfo.java 我有以下要反序列化的JSON内容: 我只需使用ObjectMapper来尝试执行反序列化。 当我这样做时,我得到: com.fasterxml.jackson.databin