gpt4 book ai didi

关于使用 $ref 的 JSON 模式

转载 作者:IT老高 更新时间:2023-10-28 12:50:49 29 4
gpt4 key购买 nike

我知道 $ref 需要一个 URI 到一个 json 模式来使用,但是 $ref : "#"指向哪里?这是否只是意味着在这个 block 级别使用当前模式?或者这是否意味着使用根级别 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 是否也可以通过转到根目录然后遍历路径直到它到达该模式来工作?谢谢!

最佳答案

OK:每个 $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 加载的,您的两个 $ref 的完整 URI 是:

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

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

对于第二个 - 这是行不通的,因为“itemSchema”没有 “definitions” 部分,所以 $ref 不会完全正确解决。

关于关于使用 $ref 的 JSON 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17595377/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com