2017-04-07 32 views
0

反序列化JSON我有類如下不能缺失多態性場

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將在對象中設置爲null。但我得到以下異常:

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

如何反序列化上面提到的JSON到對象?

相關版本:

傑克遜註釋:2.7.0, 傑克遜核心:2.7.4, 傑克遜 - 數據綁定:2.7.4

我曾嘗試用最新的補丁,即2.7。 9和最新版本2.8.6。但它不起作用。 請讓我知道這是否可能。提前致謝。

+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) 
+0

我試過了。仍然反序列化失敗。 – PratimaD

+0

你已經在'@ JsonTypeInfo'註解屬性中設置了'property =「type」'。這會導致String參數'type'和'typeSpecific'之間的衝突。重命名屬性一些其他的名字,然後我的解決方案將工作 –

+0

我改名'type'到'format'並改變相應的getter/setter方法。它仍然沒有工作。我在這裏錯過了什麼嗎?命名原因如何衝突? – PratimaD

0

嘗試:

@JsonProperty 
private Optional<TypeSpecific> typeSpecific; 
+0

這不起作用。 – PratimaD

0

你可以試試這個:

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

我已經試過了。這是行不通的。 – PratimaD