【问题标题】:Cannot resolve reference in JSON Schema using AJV - CLI无法使用 AJV 解析 JSON 架构中的引用 - CLI
【发布时间】:2017-12-31 12:44:54
【问题描述】:

我正在尝试为现有 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 指针等之间发生的情况。

【问题讨论】:

    标签: json validation schema


    【解决方案1】:

    会发生什么?

    在 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 sectionTableSchema.txt 内容的变量。

    【讨论】:

    • 绝对为我工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2010-11-14
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多