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

时间:2017-08-23 16:26:58

标签: javascript json node.js json-schema-validator

我有一个引用多个模式的JSON模式,使用'$ ref'参数,其模式反过来引用其他模式。

例如。

<display:table ....>       
        <display:column ...>    
        ${foo.value}
        </display:column>    
</display:table> 

schema xyz.json是:

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

只是为了 方便,我把它们全部放在一个目录中,并尝试使用名为Ajv的库来验证模式,但在编译模式时我收到​​错误: { "$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"} } }

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

1 个答案:

答案 0 :(得分:1)

我不知道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#"
    }
  ]
}

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

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

根据我对其他库(旧jayschema)的经验,您可能需要至少为参考编写xyz#(最后使用哈希),也可能需要编写id参数。