为何JSON Schema允许$id设为带尾斜杠的路径?
JSON Schema中$id带尾斜杠的URI使用问题
问题场景
JSON Schema测试套件中有如下测试用例,通过$id变更base URI:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "http://localhost:1234/draft2020-12/", "items": { "$id": "baseUriChange/", "items": {"$ref": "folderInteger.json"} } }
这里#/items下的子schema通过带尾斜杠的baseUriChange/将base URI变更为http://localhost:1234/draft2020-12/baseUriChange/,最终$ref解析为http://localhost:1234/draft2020-12/baseUriChange/folderInteger.json。
同时存在另一种写法,给$id指定文件名也能实现相同效果:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "http://localhost:1234/draft2020-12/abc", "items": { "$id": "baseUriChange/xyz", "items": {"$ref": "folderInteger.json"} } }
此时$ref仍解析为相同地址。针对这些场景,有以下疑问:
- 带尾斜杠的路径式
$id在JSON Schema中是否被允许? - 这种URI用法在通用场景中是否常见?
- 该设计的依据是什么?
- 为什么允许省略文件名?
问题解答
1. 带尾斜杠的路径式$id是否被允许?
完全允许。JSON Schema规范明确规定,$id的值可以是任意合法的URI(包括相对URI),只要符合URI语法规则即可。带尾斜杠的相对路径是合法的相对引用,用来变更当前schema片段的base URI是规范支持的用法。
2. 这种URI用法是否常见?
非常常见。URI的核心作用是唯一标识资源,而非仅指向物理文件。比如:
- HTTP场景中,
/api/users/这类带尾斜杠的URI常用来标识用户集合资源; - 文件系统中,目录路径本身就是带尾斜杠的URI形式,用来标识目录资源;
- 各类API规范、资源标识场景中,路径式URI都是常用的资源标识方式。
3. 设计依据是什么?
核心依据有两点:
- URI的通用解析规则(RFC 3986):相对URI的解析依赖base URI的结构,带尾斜杠的URI作为base时,后续相对引用会直接追加到路径末尾,符合直观的层级组织逻辑;
- Schema的标识与组织需求:JSON Schema的
$id是为schema片段分配唯一标识符,而非绑定到文件路径。带尾斜杠的URI可以自然地作为一组子schema的base,让schema的层级组织更灵活,无需给每个片段都指定类似文件名的标识。
4. 为什么允许省略文件名?
这是因为JSON Schema遵循通用的URI相对解析规则,两种写法本质是利用了URI解析的不同逻辑:
- 当base URI是带尾斜杠的路径(如
http://localhost:1234/draft2020-12/baseUriChange/),相对引用folderInteger.json会直接追加到路径末尾; - 当base URI是带“文件名”的形式(如
http://localhost:1234/draft2020-12/baseUriChange/xyz),相对引用会替换base URI的最后一段路径(即xyz),最终得到相同的目标URI。
允许两种写法是为了给用户提供灵活的schema组织方式,你可以根据实际场景选择用路径式或文件名式的$id,只要能达到预期的base URI变更效果即可。
内容的提问来源于stack exchange,提问作者Andreas H.
相关产品推荐
相关产品推荐

