JSON数据存储与版本控制

3

问题定义:

有一个Java服务器存储可以映射到Java类的JSON数据。Java类可能会发生变化。目标是能够更新Java类并仍然能够将旧版本的JSON数据解码为新版本的Java对象。应该有一个良好的版本控制系统。例如,能够向Java类添加具有默认值的新字段。如果旧的JSON数据没有这个字段,则Java对象可以使用字段的默认值。

问题:

我错过了什么吗?是否有其他库具有更好的版本支持?

  • 如何存储那个JSON数据?
我看到两个选择。选项1:我可以将那些具有相同结构的JSON文件(如果它们具有相同的版本)分别存储在一个文件夹中。例如,我有2个文件:json/j1.json和json/j2.json。选项2:我可以使用NoSQL数据库,如MongoDB。但是,这与前一个选项相比有什么优势吗?在DBCollection中要求BasicDBObject是没有意义的,因为我需要将其转换为另一个Java类。哪个选项建议在这种情况下使用?也许另一种选项更合适?

谷歌的 Protocol Buffer 看起来很有趣,但是在 Java 注释方面没有一个合适的实现。 - Vjeetje
虽然这并不对你使用Java有所帮助,但有趣的是,C#驱动程序恰好支持你的模式(因为你可以忽略缺失的字段,并为不存在的字段设置默认值)。 - WiredPrairie
是的,所有的 .NET 语言都支持这个。 - Vjeetje
1
到目前为止,我找到的最干净的解决方案是:使用spring-data-mongodb的内置MappingMongoConverter。1)添加字段:您可以向存储的BSON添加字段。要将此新BSON转换为POJO,将跳过旧版本的POJO的新字段。在部署POJO的新版本时,添加一个构造函数参数来读取新字段。当用户请求读取这样的POJO时,首先检查存储的BSON的版本。如果版本不匹配,则将该字段添加到BSON中。在后台运行批处理程序以提前更新所有其他旧BSON。 - Vjeetje
  1. 删除字段:这个过程分为几步。第一步是更新不再使用该字段的POJO,并部署这个新版本v1.2。当没有用户使用旧版本v1.1时,您可以部署一个新版本v1.3,删除该字段。
  2. 修改POJO成员字段的名称:结合1和2。添加一个新名称的额外字段并保留旧字段。当没有用户使用旧版本时,您可以部署一个新版本,删除旧字段名称。
- Vjeetje
显示剩余2条评论
2个回答

0

在撰写本文时(2.9.x),Jackson 没有内置的支持,但是 Jackson Model Versioning Module 添加了版本控制支持,可以用于将旧版本的 JSON 模型转换为当前版本(反之亦然),然后再映射到 POJO。

请参见我的回答 Jackson 2 support for versioning,了解如何将 GSON 的基本版本控制功能映射到此模块。请参见 模块的 GitHub 页面,了解完整功能的示例。

免责声明:我是该模块的作者。我还编写了一个 Spring MVC ResponseBodyAdvise,用于使用该模块。


0

文档存储BaseX具有JSON模块,当然,通过FLOWR这些模块可以轻松地添加到数据库中。非常容易,并且有很好的文档支持。

  let $content := file:read-text('x.json')
  let $json := json:parse($content)
  return admin:write-log($json)

像那样的东西,不确定您的要求,但肯定可以输入数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接