首页 > 解决方案 > Jackson Deserializer - 如果序列化数据中不存在,则注入键:值对

问题描述

我将事件的有效负载作为 JSON 字符串保存到数据库中。为了在代码中只有一个版本的事件,同时仍然能够读取旧事件,我想在反序列化之前“向上转换”序列化数据。

我想过这样的事情:

public Object deserialize(String data, Class<?> clazz) throws IOException {
    data = upcaster.upcast(data, clazz);
    return objectMapper.readValue(data, clazz);
}

但这意味着我将字符串转换为一些 JSON 对象两次。一次用于向上转换数据,一次用于标准杰克逊映射器。

有没有办法在构建 json 对象和构建我的事件对象之间自定义杰克逊?

就像是:

@override
updateData(clazz, jsonData) {
    if(clazz.equals(SpecificEvent.class)) {
        if(!jsonData.containsKey("addedInfo")) {
            jsonData.put("addedInfo", "foo");
        }
    }
}

或者,我可以添加自己的反序列化器,在调用我猜的标准反序列化器之前更改给定的 JSON 数据?

用杰克逊做这样的事情的正常方式是什么?

标签: javajsonjacksonevent-sourcing

解决方案


一种选择是使用专用反序列化器类(根据您自己的类)进行自定义反序列化。然后,您必须维护反序列化器类以确保它提供任何丢失的数据。

它应该适用于少数类,如果你有很多,那么可能会有更好的方法。


推荐阅读