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

时间:2017-04-07 07:00:34

标签: java json jackson-databind

我的课程如下

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;
    }
}

类ATypeSpecific扩展了TypeSpecific。

我想反序列化JSON {"type":"b"} 其中typeSpecific将在object中设置为null。但我得到以下例外:

com.fasterxml.jackson.databind.JsonMappingException: Missing property 'typeSpecific' for external type id 'type'

如何将上述JSON反序列化为对象?

依赖版本:

jackson-annotations:2.7.0, 杰克逊核心:2.7.4, jackson-databind:2.7.4

我尝试过最新的补丁,即2.7.9和最新版本2.8.6。但它没有用。 如果可能,请告诉我。提前谢谢。

4 个答案:

答案 0 :(得分:0)

您需要设置以下属性才能运行:

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

答案 1 :(得分:0)

尝试:

@JsonProperty
private Optional<TypeSpecific> typeSpecific;

答案 2 :(得分:0)

你可以试试这个:

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
        property = "type",
        defaultImpl = NoClass.class)

答案 3 :(得分:0)

就我而言,具有:

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

class AReq extend CommonReq{};

在spring mvc中,使用@RequestBody AReq来接收json http正文,我得到了类似missing subtype这样的错误,

然后我为@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)添加了AReq注释,终于解决了这个问题。

希望有帮助。