Разрешить полиморфную десериализацию Джексона с отсутствующим свойством десериализации - PullRequest
0 голосов
/ 27 апреля 2018
@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"
}

То, чего я хочу добиться, - это иметь возможность десериализации в SubClassV1 по умолчанию, когда schemaVersion не предоставляется в JSON, но я продолжаю получать следующую ошибку, даже когда я инициализирую schemaVersion в «1.0» в SuperClass:

com.fasterxml.jackson.databind.JsonMappingException: неожиданный токен (END_OBJECT), ожидаемый FIELD_NAME: отсутствует свойство 'schemaVersion', которое должно содержать идентификатор типа (для экспериментов класса. SuperClass)

Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 27 апреля 2018

Похоже, я мог бы использовать defaultImpl свойство JsonTypeInfo.

...