You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:15:25