如何在JSON模式中用URL URI标识子模式?

如何在JSON模式中用URL URI标识子模式?,url,uri,jsonschema,Url,Uri,Jsonschema,提供下一个如何识别架构的示例: { "$id": "http://example.com/root.json", "definitions": { "B": { "$id": "other.json", }, } } #/definitions/B http://example.com/other.json http://example.com/other.json#

提供下一个如何识别架构的示例:

{
    "$id": "http://example.com/root.json",
    "definitions": {
        "B": {
            "$id": "other.json",
        },
    }
}

#/definitions/B   
        http://example.com/other.json
        http://example.com/other.json#
        http://example.com/root.json#/definitions/B 
但是,如果根模式
root.json
将在
/some/path
下定义,而不是在
/
路径下定义,那么如何识别呢

{
    "$id": "http://example.com/some/path/root.json",
    "definitions": {
        "B": {
            "$id": "other.json",
        },
    }
}
应该如何识别
other.json

http://example.com/other.json
或:

规范的哪一部分定义了这一点

模式可以通过任何已提供给它们的URI来标识, 包括由“$id”直接给出的JSON指针或其URI。总共 在某些情况下,取消引用“$ref”引用需要首先解析其 值作为根据RFC 3986针对当前基本URI的URI引用 [RFC3986]。 (取消参考章节)[本规范的

“基本URI”是在JSON模式规范中引用的定义

这并不容易理解,因为它非常复杂。对于URL,要解析的引用是非哈希片段,基本URI是最后一个斜杠之前(但包括)的URI部分

(注意:JSON模式定义
$id
的值必须是绝对URI,不包含任何片段。)

因此,为了明确回答您的问题,
other.json
应标识为
http://example.com/some/path/other.json

如果您尝试在本应用程序中使用以下架构,则可以看到此操作


在“C”的
$ref
中,如果您删除
/blah
,验证器将抱怨它无法再解析引用。

您的问题可以更具体一点吗?不清楚您在问什么。@Relequestual:规范提供了
root.json
//code>路径下定义时的示例。正确的基础
http://example.com/
http://example.com/some/path
如果
root.json
是在
/some/path
path下定义的?对不起,我还是不清楚你在问什么。你能修改一下你的问题来展示一个完整的例子吗?我不明白你所说的“在下定义”是什么意思因为它有点模棱两可。@Relequestual:done一般来说,基本URI是URI引用解析所依据的URI。这与HTML中在链接中提供引用时使用的标准过程相同,它是根据在其中找到的文档的URI解析的。使用库解析URI引用,因为这并不简单@awwright真正的问题是,“我在哪里可以找到URI引用解析的规范?”.正如你所说,这不是小事,我在查看RFC时发现了这一点!请注意,你可以像我对我们的服务器所做的那样,使用目录
blah
中的
DirectoryIndex root.json
规则,这意味着你的id不需要提供root.json,这样你的C
$ref
就可以是
other.json
,ch如果退出,您可以看到它的实际操作,这是一个完整的树设置,我使用它作为
directoryindexchema.json
,因为它也适用于所有子目录directories@MartinBarker您假设example.com甚至是一个网络可访问的URI,并且服务器连接到internet,这可能不是事实,我不确定它是否与que相关让我们在JSON模式上讨论这个问题。
http://example.com/some/path/other.json
{
  "$id": "http://example.com/blah/root.json",
  "definitions": {
    "A": {
      "$id": "#foo"
    },
    "B": {
      "$id": "other.json",
      "definitions": {
        "X": {
          "$id": "#bar"
        },
        "Y": {
          "$id": "t/inner.json"
        }
      }
    },
    "C": {
      "$ref": "http://example.com/blah/other.json"
    }
  },
  "properties":{
    "a": { "$ref": "#/definitions/C" }
  }
}