我正在使用 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]:无法推断出的唯一子类型
(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"])com.xxxx.cmp.cgw.webclient.bo.Dati
我想自动检测
datiPersonaFisica
如果 datiDittaIndividuale
的特定字段丢失。但我在文档中找不到如何操作。
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...
}