Java 无法反序列化缺少多态字段的JSON

Java 无法反序列化缺少多态字段的JSON,java,json,jackson-databind,Java,Json,Jackson Databind,我的课程如下 class XYZ { private String type; private TypeSpecific typeSpecific; public TypeSpecific getTypeSpecific() { return typeSpecific; } @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInf

我的课程如下

class XYZ {
    private String type;

    private TypeSpecific typeSpecific;

    public TypeSpecific getTypeSpecific() {
        return typeSpecific;
    }

    @JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME, 
        include = JsonTypeInfo.As.EXTERNAL_PROPERTY, 
        property = "type"           
        )
    @JsonSubTypes({     
        @JsonSubTypes.Type(value = ATypeSpecific.class, name = "a")
    })
    public void setTypeSpecific(TypeSpecific typeSpecific) {
       this.typeSpecific = typeSpecific;
    }
}
类AtTypeSpecific扩展了TypeSpecific

我想反序列化JSON {type:b} 其中,typeSpecific将在对象中设置为null。但我有以下例外:

com.fasterxml.jackson.databind.JsonMappingException:缺少外部类型id“type”的属性“typeSpecific”

如何将上述JSON反序列化到对象中

依赖项版本:

jackson注释:2.7.0, 杰克逊核心:2.7.4, 杰克逊数据绑定:2.7.4

我已经试用了最新的补丁程序,即2.7.9和最新版本2.8.6。但它不起作用。
如果可能的话,请告诉我。提前感谢。

您需要设置以下属性以使其运行:

// for version 1.x       
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// for newer versions
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
尝试:

您可以尝试以下方法:

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
        property = "type",
        defaultImpl = NoClass.class)
就我而言,拥有:

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "@c")
class CommonReq{};

class AReq extend CommonReq{};
在SpringMVC中,使用@RequestBody AReq接收json http body,我得到了这个错误,比如缺少子类型

我为AReq添加了@JsonTypeInfouse=JsonTypeInfo.Id.NONE注释,最后解决了这个问题


希望有帮助。

您必须将该字段标记为optional您已经在@JsonTypeInfo注释属性中设置了property=type。这导致字符串参数类型和类型特定之间发生冲突。将属性重命名为其他名称,然后我的解决方案将使用重命名的类型格式化并更改相应的getter/setter。但它仍然不起作用。我是不是遗漏了什么?命名如何导致冲突?我要求您将@JsonTypeInfo use=JsonTypeInfo.Id.NAME、include=JsonTypeInfo.As.EXTERNAL_属性、PROPERTY=type重命名为@JsonTypeInfo use=JsonTypeInfo.Id.NAME、include=JsonTypeInfo.As.EXTERNAL_属性,property=format是的,我将其与JSON一起重命名。现在我的JSON是{format:b}。该解决方案还应该适用于JSON{format:a,typeSpecific:{//fields}。它对你有用吗?
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "@c")
class CommonReq{};

class AReq extend CommonReq{};