0

遇到合作伙伴 API 还不能正常工作的情况。我收到的对象是这样的

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

我怎样才能专门化 Jackson 的行为,以便我可以将此行为应用于任何对象,所以如果无法映射任何字段,我可以处理这个并替换为 null 或任何默认对象?

4

1 回答 1

0

这看起来更像是一个业务用例,而不是Jackson特定的行为。此外,在 Java 中,您不能有一个方法同时处理Exception和返回 a 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

PS 上面的例子使用slf4j.

于 2017-04-10T11:38:19.883 回答