java - 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 数据?
用杰克逊做这样的事情的正常方式是什么?
解决方案
一种选择是使用专用反序列化器类(根据您自己的类)进行自定义反序列化。然后,您必须维护反序列化器类以确保它提供任何丢失的数据。
它应该适用于少数类,如果你有很多,那么可能会有更好的方法。
推荐阅读
- c++ - 如何在不更改/检测模块源的情况下对用户定义的“operator new”和“operator delete”进行单元测试?
- node.js - 如何使用 npm 包 exceljs 单击按钮下载 excel 文件
- microsoft-teams - 带有 SSO 的 MS Teams 应用程序适用于两个应用程序
- c++ - 错误:将 'const Flacon' 作为 'this' 参数传递会丢弃限定符 [-fpermissive]
- java - Java 构造函数:错误“实际参数列表和形式参数列表的长度不同”
- python - 使用正则表达式根据大写在字符串中添加空格?
- python - 我不明白内置功能(形状)
- django - 如何对 Django 说不要散列用户密码?
- php - 使用 PHP 将数据从 CSV 导入 MYSQL
- javascript - 从另一个按许多对象属性分组的对象返回数组