如何使用嵌套引用验证 JSON 模式

How to validate a JSON schema with nested references

我有一个引用多个模式的 JSON 模式,使用“$ref”参数,其模式又引用其他模式。

例如

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "allOf": [
    {
      "$ref": "xyz.json"
    }
  ]
}

架构 xyz.json 是:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": { "type": "string",  "title": "Identifier"},
    "Xid": { "type": "object",  "$ref": "pqr.json", "title": "X Identifier"}
    }
}

只为 方便起见,我将它们全部放在一个目录中,并尝试使用名为 Ajv 的库验证模式,但在编译模式时出现错误: can't resolve reference #/event.json from id

我怎样才能验证这样的 JSON 架构?我的目标是为所有模式创建一个 JavaScript 对象模型。谢谢。

我不知道 Ajv,但从查看文档来看,这似乎可以通过 .addSchema 方法来完成。添加所有这样的部分模式(node.js 中的 fs.readFileSync 只是为了论证,在浏览器中它可能是一个 XMLHttpRequest):

var main = JSON.parse(fs.readFileSync('main.json'));
var xyz = JSON.parse(fs.readFileSync('xyz.json'));

var avj = new Avj(main);

avj.addSchema(xyz, 'xyz');

并使用您在第二个参数中设置的 ID 从主架构中引用它:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "allOf": [
    {
      "$ref": "xyz#"
    }
  ]
}

如果您有多个部分模式,您也可以将它们全部添加到一个数组中,如果您将 id 设置为属性:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "xyz",
  ...
}

根据我使用其他库(旧的 jayschema)的经验,您可能需要编写 xyz#(末尾带有哈希)至少用于参考,也许还用于 id参数.