JSON Schema 2020-12相对嵌套$id的URI解析疑问
JSON Schema嵌套$id的URI解析规则详解
你提到的这个测试用例核心是JSON Schema中相对路径$id的解析逻辑——不是简单在父级$id后追加字符串,而是基于父级URI的「目录路径」来拼接。
核心规则拆解
JSON Schema规定:当子schema使用相对路径的$id时,解析的基础是父级schema的基础URI去掉最后一个路径段(把父级URI当成一个文件,取它所在的目录),而不是直接在父级URI末尾追加相对路径。
对应你的测试用例分析
- 外层
$id是http://localhost:1234/draft2020-12/root,这个URI被视为一个具体的资源(比如名为root的文件),它的「所在目录」是http://localhost:1234/draft2020-12/。 - 内层
$id是nested.json,这是相对路径,所以会和父级的目录路径拼接,得到http://localhost:1234/draft2020-12/nested.json——这就是为什么结果里没有root。
为什么测试用例的$ref能匹配到B定义
测试用例中的$ref直接指向http://localhost:1234/draft2020-12/nested.json#foo,其中:
http://localhost:1234/draft2020-12/nested.json是内层$id解析后的URI,对应子schemaA的基础URI;#foo是子schemaB的$anchor标识,所以这个$ref能精准定位到B的定义(要求类型为整数),因此测试数据1匹配,"a"不匹配。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

