2016-07-07 51 views
0

使用Java 8和傑克遜,我想從這裏解析JSON:傑克遜和JSON當值的類型改變

REST Endpoint

的問題是,有一個單一的價值,有時是空數組,有時是一個HashMap。我粘貼空兩個摘錄,檢查出cor_icon每個:

"2630775": { 
    "id": "2630775", 
    "label": "breakfast grill", 
    "description": "breakfast sandwiches, turkey sausage and bacon, home fries, pork sausage and bacon, omelets made to order with whole eggs, egg whites, eggbeaters and assorted fillings", 
    "zero_entree": "0", 
    "cor_icon": { 
    "18": "humane" 
    }, 

或者:

"4779080": { 
    "id": "4779080", 
    "label": "sweet chili vegan soup\nchicken egg drop soup", 
    "description": "", 
    "zero_entree": "0", 
    "cor_icon": { 
    "1": "vegetarian", 
    "4": "vegan" 
    }, 

至於反對:

"2630777": { 
    "id": "2630777", 
    "label": "morning pastries", 
    "description": "assorted danish, muffins, bagels, coffee cakes and tea breads", 
    "zero_entree": "0", 
    "cor_icon": [], 
    "ordered_cor_icon": [], 

對於我的Java二傳手:

@JsonSetter("cor_icon") 
public void setCorIcon(HashMap ci) 
{ 
    cor_icon = ci; 
} 

或更好:

@JsonSetter("cor_icon") 
public void setCorIcon(HashMap<String, String> ci) 
{ 
    cor_icon = ci; 
} 

這個工作正常,當有數據但沒有時,當我得到「cor_icon」:[]傑克遜拋出一個異常,說它不能從cor_icon反序列化HashMap。如果我將cor_icon更改爲ArrayList,那麼當存在數據時,Jackson會抱怨它無法從cor_icon反序列化ArrayList。

那麼有什麼竅門?

+0

本文可能會幫助你。 http://www.baeldung.com/jackson-deserialization –

回答

0

您需要指定對JSON數組和JSON對象有效的類型。兩個明顯的選擇是java.lang.ObjectJsonNode:在第一種情況下,您將得到ListMap(並且需要投射);在後一種情況下ArrayNodeObjectNode

+0

我真的很討厭這樣的東西,但它似乎是最簡單的方法,謝謝。 –

+0

@JimArcher實際上,重新閱讀這個問題:或許您正在尋找'DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT',它解決了某些langs(PHP?)序列化的奇怪問題,其中empty/missing對象由於某種原因被序列化爲空的JSON數組。 – StaxMan

+0

謝謝,我會檢查一下。在這一點上,我已經完成了所有的演員,但我可能會重新如此... –