我的linux机器上运行了一个服务,该服务在机器启动时读取存储在.json文件中的数据。然后,该服务验证传入的JSON数据,并根据数据修改特定的系统配置。该服务是用C++编写的,用于验证https://github.com/pboettch/json-schema-validator.
在开发过程中,很容易修改JSON模式,只需手动调整数据即可。我已经开始为我的JSON模式使用语义版本控制,并以以下方式包含它:
JSON模式:
{
"$id": "https://my-company.org/schemas/config/0.1.0/config.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
// Start of Schema definition
}
JSON数据:
{
"$schema": "https://my-comapny.org/schemas/config/0.1.0/config.schema.json",
// Rest of JSON data
}
通过添加版本,我可以在验证之前检查是否存在版本不匹配的情况。
如果发现版本不匹配,我正在寻找一种自动迁移JSON数据以匹配较新模式版本的方法。有没有任何方法可以自动实现这一点,或者是手动编辑JSON数据以匹配模式的唯一方法?
由于我计划将其作为开源发布,我真的很想包括某种形式的自动迁移,这样我就可以询问用户是否希望迁移以符合最新的模式版本,而不是在发现版本不匹配时抛出错误。
您所要求的是需要做出假设才能发挥作用的东西。
这是一个由来已久的问题,与数据库类似。您可以通过许多简单的更改生成模式迁移,但如果您也希望自动转换现有数据,则这是不可行的。
让我们看一个基本的例子。可以重命名字段。一个工具怎么会知道你已经重命名了一个字段,而不是删除了一个旧字段并添加了一个新字段?它本质上不能。
因此,您需要手动编写迁移。
您可以使用像jq或fx这样的JSON转换工具来创建迁移脚本,而无需将其写入代码,这可能是可取的,也可能不是可取的。(jq有一个更陡峭的学习曲线,但它也非常强大。(