2013-11-04 19 views
4

我使用傑克遜反序列化來自我沒有的服務器的json響應。我使用JsonTypeInfo註釋來處理多態數據類型。這裏的配置我有我的基本類型(Thing在這種情況下):傑克遜:「意外的標記(VALUE_STRING),預計FIELD_NAME:」當反序列化空字符串,而不是預期的對象

@JsonTypeInfo(
     use = JsonTypeInfo.Id.NAME, 
     include = JsonTypeInfo.As.PROPERTY, 
     property = "type") 
@JsonSubTypes({ 
     @JsonSubTypes.Type(value = Thing.class, name = "Thing"), 
     @JsonSubTypes.Type(value = FancyThing.class, name = "FancyThing") 
}) 

一切都很正常,直到服務器返回那裏我期待這些類型的一個空字符串,然後我得到的其中之一:

org.codehaus.jackson.map.JsonMappingException: Unexpected token (VALUE_STRING), expected FIELD_NAME: missing property 'type' that is to contain type id (for class com.stackoverflow.Thing)

是否有推薦的方式來處理這種情況?就像我說的,我不控制服務器,所以我必須處理這個客戶端。我寧願通過配置ObjectMapper來解決這個問題,但ObjectMapper#configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)似乎沒有按照我預期的方式工作。有任何想法嗎?

回答

7

好的,所以有時只需要問一個答案就是問自己正確的問題。事實證明,我想我正在看javadocs的一個老版本,因爲我發現了@JsonTypeInfo#defaultImpl,這讓我走上了正軌。

現在我有一些看起來像這樣:

@JsonTypeInfo(
     use = JsonTypeInfo.Id.NAME, 
     include = JsonTypeInfo.As.PROPERTY, 
     property = "type" 
     defaultImpl = EmptyThing.class) 
@JsonSubTypes({ 
     @JsonSubTypes.Type(value = Thing.class, name = "Thing"), 
     @JsonSubTypes.Type(value = FancyThing.class, name = "FancyThing") 
}) 
public class Thing { 

... 

} 

public class EmptyThing extends Thing { 

    public EmptyThing(String s) { 
     // Jackson wants a single-string constructor for the default impl 
    } 
} 
+0

我應該怎麼做,如果使用參數的構造,也不會喜歡用空的構造? –

相關問題