无法使用AJV-CLI解析JSON Schema中的引用

时间:2017-07-25 14:11:50

标签: json validation schema

我正在尝试为现有的JSON数据文件构建JSON模式(draft-06)。架构已经变得很大,以适应单个文件,我试图将其分解为多个文件。但是我一直收到错误can't resovle refrence sectionTableSchema.txt from id http://somesite/section

我制作了以下文件并将它们放在同一目录中。这些文件不托管在网络服务器上。

settingsSchema.txt:

{
  "title":"Settings",
  "$schema":"http://json-schema.org/draft-06/schema#",
  "$id":"http://somesite/settingsSchema.txt",
  "properties":{
    "section":{
      ...
      ...
      ...
      "$id":"/section",
      "items":{
        "oneOf":[
          {"$ref":"#/sectionTableSchema.txt"},
          {"$ref":"#/sectionNonTableSchema.txt"}
        ]
      },
      "type":"array"
    }
  },
  "type":"object"
}

sectionTableSchema.txt

{
  "$schema":"http://json-schema.org/draft-06/schema#",
  "$id":"http://somesite/sectionTableSchema.txt",
  "definitions":{},
  "properties":{
    ....
    ....
    ....
  }
  "type":"object"
}

我认为我的一部分问题是我不了解$id$ref关键字,足以了解绝对uri,相对uri,json-pointers等之间的情况。

1 个答案:

答案 0 :(得分:0)

会发生什么?

在OP的示例中,"$ref":"#/sectionTableSchema.txt"的意思是“在当前模式文件中,从根元素获取名为sectionTableSchema.txt的JSON属性”。


$ ref如何工作?

$ref可以分为两个部分:

  • 在“#”符号之前,您可以指定架构文件的URI(简单来说,是路径)。如果$ref从“#”符号开始,因此不提供架构文件的URI,则意味着您要从当前文件中提取架构。
  • 在“#”符号之后,您可以提供JSON指针,例如G。位于指定文件(或当前文件,取决于在“#”符号前提供的架构URI)中的JSON属性的路径。

可以在documentation中找到相同的信息。


如何正确引用其他文件?

据我了解, JSON模式草稿说,您可以为模式文件指定有效的URI。但是URI不能是相对的,因此没有标准定义的方法来引用具有相对路径的文件。但是,在实践中,许多工具提供了执行此功能的能力,尽管它们不是标准的一部分,并且可能因工具而异。

在AJV 中,您可以将引用写为"$ref":"ANY-ID-YOU-WANT"并使用ajv.addSchema(schemaJson, 'ANY-ID-YOU-WANT')方法,其中schemaJson是具有require'd { {1}}内容。