自动将 JSON 数据迁移到最新版本的 JSON 架构

Automatically migrate JSON data to newest version of JSON schema

我的 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 数据以匹配模式的唯一方法?

因为我计划将其作为开源发布,所以我真的很想包括某种形式的自动迁移,这样我就可以询问用户是否要迁移以符合最新的架构版本,而不是抛出错误,如果发现版本不匹配。

您所要求的是需要做出假设才能起作用的东西。

这是一个古老的问题,与数据库类似。您可以通过许多简单的更改生成架构迁移,但如果您也希望自动转换现有数据,这是不可行的。

让我们看一个基本的例子。您重命名一个字段。 工具如何知道您重命名了一个字段还是删除了一个旧字段并添加了一个新字段?它本质上是不能的。

因此,您需要手动编写迁移。

您可以使用 JSON 转换工具,如 jq or fx 创建迁移脚本,而无需将其编写成代码,这可能更可取,也可能不是。 (jq 的学习曲线比较陡峭,但它也非常强大。)