JsonMappingException处理和反序列化我们所能做的一切

时间:2017-04-10 10:53:15

标签: java jackson-databind

当合作伙伴API无法正常运行时出现这种情况。 我收到的对象是这样的

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

所需的解决方案是记录JsonMappingException并将其保存在DB中,而不是使对象崩溃,但在结果中将 null 值替换为无法反序列化的对象。

{
    "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 - 没有像我需要的功能似乎存在。

我如何专注于Jackson的行为,以便我可以将此行为应用于任何对象,因此如果无法映射任何字段,我可以处理此并替换为null或任何默认对象?

1 个答案:

答案 0 :(得分: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

P.S。以上示例使用slf4j