当存在相对嵌套的 $id 时,如何解析 JSON Schema 2020-12 的 $id?

问题描述 投票:0回答:1

我正在查看来自 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
        }
    ]
}
jsonschema
1个回答
0
投票

RFC3986#第 5.2.3 节

返回由引用的路径组件组成的字符串 附加到基本 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

© www.soinside.com 2019 - 2024. All rights reserved.