2017-06-13 65 views
1

我正在使用第三方API,它爲相同的JSON屬性返回三種不同類型,具體取決於它包含多少個嵌套對象。我試圖找出處理使用Jackson對這些對象進行反序列化的最佳方法(最好使用Retrofit)。對多個類型的屬性進行反序列化JSON

簡化示例:從這個API檢索顧客記錄時,響應可能是任何一個:

  1. 客戶擁有的多個電話號碼;返回PhoneObjects

    { 
        "Phones": { 
         "PhoneObject":[ 
          {"number":"800 555 6666","type":"Home"}, 
          {"number":"800 555 4444","type":"Work"} 
         ] 
        } 
    } 
    
  2. 顧客的陣列有一個電話號碼;退貨單PhoneObject

    { 
        "Phones": { 
         "PhoneObject": {"number":"800 555 6666","type":"Home"} 
        }, 
    } 
    
  3. 客戶沒有電話號碼;通過與傑克遜反序列化到Map<String, Object>和檢查Object,以確定它是什麼類型,然後將其插入,例如返回一個空字符串(!)

    { 
        "Phones": { 
         "PhoneObject":"" 
        } 
    } 
    

目前,我處理這個一個List<PhoneObject>(如果對象不存在,則返回一個空列表)。然而,這很麻煩,並希望找到一種更簡潔的方式來反序列化這些對象。

+0

你可以讓他們修復他們的API來返回一個理智的迴應嗎? – SLaks

+0

我同意這將是最好的解決方案。不幸的是,這不是一種選擇。 – Rob

回答

2

我是能夠全部3個JSON字符串解析到這個Phones

class Phones { 
    @JsonProperty("PhoneObject") 
    private List<PhoneObject> phoneObjects; 
} 

與此ObjectMapper配置:

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); 
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 

ACCEPT_SINGLE_VALUE_AS_ARRAY允許解析一個值的列表,包括尺寸1.

ACCEPT_EMPTY_STRING_AS_NULL_OBJECT允許將空字符串解析爲null。在這種情況下,phoneObjects結束爲null。不理想,但我不知道在這裏獲得一個空列表的簡單方法。

根據您的POJO,您可能需要也可能不需要UNWRAP_ROOT_VALUE

+0

謝謝。這不僅僅是一種魅力,而且我學到了更多關於傑克遜的知識。 – Rob

相關問題