当合作伙伴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或任何默认对象?
答案 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
。