Jackson 在字段缺失时使用基于演绎的反序列化

问题描述 投票:0回答:1

我正在使用 Jackson 来反序列化这个类

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes({
        @JsonSubTypes.Type(value = DatiSocieta.class, name = "datiSocieta"),
        @JsonSubTypes.Type(value = DatiPersonaFisica.class, name = "datiPersonaFisica") ,
        @JsonSubTypes.Type(value = DatiDittaIndividuale.class, name = "datiDittaIndividuale") }
)
public interface Dati {
}

问题是

datiPersonaFisica
datiDittaIndividuale
不明确

@Data
public
class DatiPersonaFisica implements Dati {
    private String codiceFiscale;
    private String sesso;
    private String nome;
    private String cognome;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date dataNascita;
    private String luogoNascita;
    private String provinciaNascita;
    private String nazioneNascita;
}

@Data
public
class DatiDittaIndividuale implements Dati {
    private String denominazione;
    private String codiceFiscale;
    private String sesso;
    private String nome;
    private String cognome;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date dataNascita;
    private String luogoNascita;
    private String provinciaNascita;
    private String nazioneNascita;
    private String numeroRea;
    private String provinciaCCIA;
    private String partitaIVA;
}

所以它给了我错误

JSON解析错误:无法解析[简单类型,类的子类型 com.XXXX.cmp.cgw.webclient.bo.Dati]:无法推断出的唯一子类型

com.xxxx.cmp.cgw.webclient.bo.Dati
(2 名候选人匹配);嵌套的 例外是 com.fasterxml.jackson.databind.exc.InvalidTypeIdException:无法 解析 [简单类型、类 com.xxxx.cmp.cgw.webclient.bo.Dati]:无法推断出的唯一子类型
com.xxxx.cmp.cgw.webclient.bo.Dati
(2位候选人匹配) 在 [来源:(org.springframework.util.StreamUtils$NonClosingInputStream); 行:12,列:5](通过参考链: com.xxxx.cmp.cgw.webclient.dto.ClienteDTO["soggetto"]->com.xxxx.cmp.cgw.webclient.bo.Soggetto["anagrafica"])

我想自动检测

datiPersonaFisica
如果
datiDittaIndividuale
的特定字段丢失。但我在文档中找不到如何操作。

java json inheritance jackson deserialization
1个回答
0
投票

DatiPersonaFisica
类中的属性是
DatiDittaIndividuale
中属性的子集。如果 Jackson 尝试仅使用
DatiPersonaFisica
的字段反序列化 Json,则它无法判断要构造哪个实例,因为该 Json 可能来自
DatiDittaIndividuale
的实例,其唯一的序列化字段是与
 相同的字段DatiPersonaFisica

在您的情况下,由于无法区分 Json 中的哪个类,因此使用

use = JsonTypeInfo.Id.NAME
的实现更适合。你的课程可能看起来像这样:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "datiType"
)
@JsonSubTypes({
        @JsonSubTypes.Type(value = DatiSocieta.class, name = "datiSocieta"),
        @JsonSubTypes.Type(value = DatiPersonaFisica.class, name = "datiPersonaFisica"),
        @JsonSubTypes.Type(value = DatiDittaIndividuale.class, name = "datiDittaIndividuale")
})
public interface Dati {
}

@Data
public
class DatiPersonaFisica implements Dati {
    // fields...
}

@Data
public
class DatiDittaIndividuale implements Dati {
    // fields...
}
© www.soinside.com 2019 - 2024. All rights reserved.