是否可以在 JSON 模式中以编程方式扩展引用?

Is it possible to programmatically expand references in a JSON schema?

我正在接收 JSON 有效载荷,我想用它们做两件事:

  1. 根据模式验证负载
  2. 过滤掉架构中未包含的字段

我要过滤的字段不是无效的,我只是想将它们从我正在使用的 JSON 中删除(对于我的用例,这些是我们不想存储的 PII ).

我找到了 this library that seems to take care of the filtering for us。我发现的问题是它不处理引用 - 任何引用对象定义的对象在我们进行过滤时都不会填充数据。

We're using this library for schema validation. I was hoping we might be able to use this library to expand the references in the schema so that we can still use the same filtering library. This old issue suggests that in a previous version this was possible using a class called ResolvingSchemaWalker, but that class has been removed in more recent versions and I haven't been able to figure out how to traverse a schema to resolve references in the more recent versions of the library. The RefResolver class 似乎做了类似的事情,但它添加了一个引用对象定义的 JsonPointer 而不是用实际的 JSON 对象替换引用。

如果需要,我可能会手动编辑我的架构以删除所有引用,但我想尽可能避免这种情况。 我想用编程方式替换架构中的引用吗? 根据我在 json-schema-validator 库中发现的那个老问题,它似乎应该是当前版本库中的 RefResolver 似乎完成了我正在寻找的大部分内容,但我一直无法弄清楚如何使用它来扩展模式中的那些引用。

如果有人可以向我指出处理引用的不同过滤库,那也可以解决问题。我们并不一定要使用这个过滤库,但它是我能找到的最好的选择,而且除了引用问题之外,它似乎可以做我们想做的一切。

可以删除所有外部引用(对其他架构文档的引用)。这通常称为模式捆绑。但是,并非总是可以删除所有本地引用(同一架构文档中的引用,例如 $defs/definitions)。

捆绑其实很简单。这里有一些参考。

内联本地引用的范围从微不足道到困难到不可能。如果内联的子模式中没有引用,则可以进行简单的替换。如果被内联的子模式有引用,您可能必须重写这些引用,因为它们的目标也可能已被移动。如果模式是递归的,则完全内联的模式将无限大。当然你可以限制递归深度,只使用非常大的模式而不是无限大的模式。

因此,如果您的工具不能处理本地引用,那么它几乎毫无用处,您也无能为力。如果您的工具不处理外部引用,那应该不是问题。手动捆绑模式非常容易。您甚至不需要额外的工具。