【问题标题】:JSON Schema regarding use of $ref关于使用 $ref 的 JSON Schema
【发布时间】:2013-07-09 20:13:51
【问题描述】:

我知道 $ref 需要一个 URI 到一个 json 模式来使用,但是 $ref : "#" 指向哪里? 这是否只是意味着在这个块级别使用当前模式?或者这是否意味着使用根级别 id 中定义的根级别架构? 谢谢

编辑: 所以如果我有:

"items": {
        "anyOf": [
            { "$ref": "#" },
            { "$ref": "#/definitions/schemaArray" }
        ],
        "default": {}
    }

因为它缺少一个 id 字段,它会首先尝试使用根架构验证实例项,然后如果失败则尝试使用定义架构中定义的 schemaArray 架构来验证它,对吗?

所以如果我把它改成:

 "items": {
            "id" : "#/items",
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": {}
        }

那么 anyOf 数组中的第一个子模式会指向 items 模式本身吗?

编辑#2:好的,如果我有:

 "items": {
        "id" : "itemSchema",
        "anyOf": [
            { "$ref": "#" },
            { "$ref": "#/definitions/schemaArray" }
        ],
        "default": {}
    }

"stringArray": {
        "type": "array",
        "items": { "$ref" : "itemSchema" },
        "minItems": 1,
        "uniqueItems": true
    }

“stringArray”的“items”字段将根据上述“itemsSchema”进行验证?

'anyOf' 中的第二个 $ref 是否也可以通过转到根目录然后遍历路径直到它到达该模式来工作? 谢谢!

【问题讨论】:

  • 您能否说明这与哪个草稿版本有关?

标签: json jsonschema


【解决方案1】:

好的:每个$ref 都被解析为一个完整的URI。完成后,您的所有问题都会通过以下问题得到回答:如果我只是获取那个 URI,我最终会得到什么架构?$ref 在哪里,它是如何加载的,所有其中无关紧要 - 它完全依赖于解析的 URI。

可能采取一些捷径(例如缓存文档以便它们只被提取一次,或者信任一个模式来“代表”另一个模式),但这些都是实现细节。

回复原问题:

# 并不特殊:$ref 的所有值都被解析为相对于当前文档的 URI(或最接近的 "id" 值,如果有的话)。

因此,如果您没有使用过"id",那么# 将指向架构文档的根。如果您从 http://example.com/schema 获取架构,那么其中的 {"$ref": "#"} anywhere 将解析为 http://example.com/schema#,即文档本身。

使用 "id" 时会有所不同,因为它会更改解析 $ref 所依据的“基本”架构:

{
    "type": "array",
    "items": {
        "id": "http://example.com/item-schema",
        "type": "object",
        "additionalProperties": {"$ref": "#"}
    }
}

在该示例中,$ref 解析为 http://example.com/item-schema#。现在,如果您的 JSON Schema 设置信任它已经拥有的模式,那么它可以重新使用“items”中的值。

然而,# 并没有什么特别之处——它只是像其他任何一个一样解析为一个 URI。

对编辑 1 的回应:

你的第一个例子是正确的。

但是,不幸的是,您的第二个不是。这是因为片段解析对 URI 起作用的方式:一个片段完全替换另一个片段。当您针对#/items"id" 值解析# 时,您不会再次以#/items 结束 - 您以# 结束。因此,在您的第二个示例中,"anyOf" 中的第一个条目仍将解析为文档的根目录,就像在第一个示例中一样。

对编辑 2 的回应:

假设文档是从http://example.com/my-schema 加载的,那么您的两个$refs 的完整URI 是:

  • http://example.com/itemSchema#
  • http://example.com/itemSchema#/definitions/schemaArray

对于第一个,库可能使用它已经拥有的架构,但它可能不会 - 毕竟,查看 URI,http://example.com/my-schema 可能无法准确表示 @987654349 @。

对于第二个 - 这是行不通的,因为“itemSchema”没有"definitions" 部分,所以$ref 根本无法正确解析。

【讨论】:

  • 感谢您的回答。一个快速的澄清。请查看已编辑的问题。
  • 嗯,有道理。我对问题进行了最后一次编辑以澄清一些事情。如果你能看看那将是很棒的。谢谢!
  • 好的,现在你的问题和我的回答都越来越长了。 :p 我认为如果您还有其他问题,您可能应该将其提交给 JSON Schema Google Group。
  • 哈哈谢谢。你实际上用最后一个回答了我的问题。再次感谢!
  • @cloudfeet 你能看看我的问题吗:stackoverflow.com/questions/38034478/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多