我正在查看来自 https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/main/tests/draft2020-12/anchor 的 JSON Schema $anchor 测试之一。 json,我不明白 $ref 应该如何解析为“B”对象定义。
在下面的测试中,外部
$id
设置为 http://localhost:1234/draft2020-12/root
,内部 $id
设置为 nested.json
。那么内部 $id
的完全解析 URI 不应该设置为 http://localhost:1234/draft2020-12/root/nested.json
吗?
根据测试,看起来内部
$id
应该解析为 http://localhost:1234/draft2020-12/nested.json
,从路径中取出 root
。
{
"description": "Location-independent identifier with base URI change in subschema",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "http://localhost:1234/draft2020-12/root",
"$ref": "http://localhost:1234/draft2020-12/nested.json#foo",
"$defs": {
"A": {
"$id": "nested.json",
"$defs": {
"B": {
"$anchor": "foo",
"type": "integer"
}
}
}
}
},
"tests": [
{
"data": 1,
"description": "match",
"valid": true
},
{
"data": "a",
"description": "mismatch",
"valid": false
}
]
}
返回由引用的路径组件组成的字符串 附加到基本 URI 路径的最后一段之外的所有段(即 排除基本 URI 中最右侧“/”之后的任何字符 路径,或者如果不包含则排除整个基本 URI 路径 任何“/”字符)。
此模式的 baseUri 是
http://localhost:1234/draft2020-12/root
$id
的 nested.json
被视为相对路径引用,因为它不包含方案,也不以 //
或 /
开头。它根据入口点的基本 uri 进行解析,该入口点是封闭架构,不包括基本 URI 路径中最右侧 /
之后的任何字符,http://localhost:1234/draft2020-12/
遵循上述规则。
最后一块是
$anchor
关键字中的纯片段,foo
。
src:https://json-schema.org/draft/2020-12/json-schema-core#section-8.2.2-6
请注意,锚字符串不包含“#”字符,因为它不是 URI 引用。当在 URI 中使用时,“$anchor”:“foo”将成为片段“#foo”。
因此,普通片段根据封闭模式的基本 uri 进行解析,
nested.json#foo
然后根据封闭模式的基本 uri 进行解析 http://localhost:1234/draft2020-12/nested.json#foo