2017-04-10 33 views
0

遇到合作伙伴API無法正常工作的情況。 我收到的對象是這樣的JsonMappingException處理並反序列化所有我們可以的

{ 
    "id": 1,   // Can deserealize 
    "type": "HUMAN", // Can deserealize 
    "age": 18,  // Can deserealize 
    "armor": {},  // JsonMappingException 
    "weapon": {}  // Can deserealize 
} 

所需的解決辦法是登錄JsonMappingException並將其保存在數據庫,而不是崩潰的對象,但結果把值而不是不能反序列化對象。

{ 
    "id": 1,   // Can deserealize 
    "type": "HUMAN", // Can deserealize 
    "age": 18,  // Can deserealize 
    "armor": null, // Replaced to null or default object 
    "weapon": {}  // Can deserealize 
} 

我已嘗試添加DeserializationProblemHandler-都沒法被解僱和DeserializationFeature - 就像我不需要的功能似乎存在。

我如何專門化傑克遜的行爲,以便我可以將這種行爲應用於任何對象,因此如果任何字段無法映射,我可以處理這個並用null或任何默認對象替換?

+0

你能分享反序列化代碼嗎? –

+0

'ObjectMapper mapper = new ObjectMapper(); Player player = null; try { \t player = mapper.readValue(new File(「bad_json.txt」),Player.class); } catch(IOException e){ \t log.error(「Bad json」,e); }'有些類還有反序列化器,我也拋出了JsonMappingException。 –

+0

你可以將它添加到問題中嗎?另外,你還可以添加'Player'類的結構嗎? –

回答

0

這看起來更像是一個商業用例,而不是Jackson的具體行爲。此外,在Java中,您不能有一種方法同時發送一個Exception並返回一個value

而是寫一個自定義解串器(這是完全沒有必要的),你可以反序列化後檢查該字段,如果它是空,持久化對象,例如:

String json = ""; //json string 
ObjectMapper mapper = new ObjectMapper(); 
Person person = mapper.readValue(json, Person.class); 
if(person.getArmour() == null) { 
    LOGGER.error("Received a Person object witn no armour : {}", person.getId()); 
} 
//Save Person object 

附註:之前登錄錯誤以上示例使用slf4j

+0

問題是我無法獲取Person對象,因爲'mapper.readValue(json,Person.class);'在反序列化裝甲對象時拋出JsonMappingException異常。 –

+0

你可以添加Person類結構和/或反序列化邏輯嗎?如果armour爲null,不要認爲它應該拋出'JsonMappingException'。 –

+0

如果你看看這個問題,我已經標記了armor拋出JsonMappingException。我想抓住它,記錄下來,並用空置換裝甲。 –

相關問題