2011-09-21 72 views
4

我試圖反序列化JSON對象爲使用一個Abstact類「動物」傑克遜註釋的Java對象:傑克遜反序列化中的異常標記(END_OBJECT),

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@JsonSubTypes({@Type(value = Dog.class, name = "chien"), 
@Type(value = Cat.class, name= "chat")}) 

,這裏是一個樣本JSON字符串:

{ 
    "name": "Chihuahua", 
    "type": { 
       "code": "chien", 
       "description": "Chien mechant" 
      } 
} 

問題是JSON對象中的屬性「type」也是一個對象。當我嘗試反序列化我有這個例外:

Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id '{' into a subtype of [simple type, class Animal] 

我試圖用「type.code」作爲‘財產’的價值,但一無所獲。執行是這樣的

Caused by: org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type.code' that is to contain type id (for class Animal) 

任何想法有什麼不對。謝謝。

回答

-3

我初學者與傑克遜,但我認爲你必須搜索樹解析像解釋here

+0

不相關... – FazoM

+0

如果你願意:)。 – FazoM

0

已經發現沒有辦法解決這個問題後,拋出了這一點那裏。如果任何人在這方面遇到困難,我會提出自己的風格。如果您找到其他方法,請隨時添加您自己的解決方案。

我已經在我的枚舉中實現瞭解決此問題的方法,其中添加了findByType方法,該方法允許您在枚舉鍵值的字符串表示形式上進行搜索。 所以,在你的榜樣,你有一個鍵/值對這樣一個枚舉,

pubilc enum MyEnum { 
... 
CHIEN("chien", "Chien mechant") 
... 
} 
// Map used to hold mappings between the event key and description 
private static final Map<String, String> MY_MAP = new HashMap<String, String>(); 

// Statically fills the #MY_MAP. 
static { 
    for (final MyEnum myEnum: MyEnum.values()) { 
     MY_MAP.put(myEnum.getKey(), myEnum); 
    } 
} 

,然後你將有一個公共的方法findByTypeCode,將返回類型爲你搜索的關鍵在於:

public static MyEnum findByKey(String pKey) { 
    final MyEnum match = MY_MAP.get(pKey); 
    if (match == null) { 
     throw new SomeNotFoundException("No match found for the given key: " + pKey); 
    } 
    return match; 
} 

我希望這有助於。就像我說的那樣,可能有一個解決方案直接解決這個問題,但我沒有找到一個解決方案,並且不需要浪費更多時間尋找解決方案。

+0

添加這將工作@JsonIgnoreProperties(ignoreUnknown = true) –