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

为何未使用allOf的JSON Schema仍可生效?技术问询

为什么这个JSON Schema不用allOf也能生效?

我写了下面这个JSON Schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://my.assets/schemas/message",
  "$ref":"/schemas#/$defs/envelope_type",
  "properties": {
    "data": {
      "$ref":"/schemas/profile#/$defs/touch_type"
    }
  }
}

其中envelope_type要求必须包含data字段,我在这里又进一步定义了data的结构。验证器判定这个Schema合法,实际测试的实例也符合预期,但我有点疑惑:为什么不用像下面这样用allOf把$ref和properties组合起来,也能正常生效?

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://my.assets/schemas/message",
  "allOf": [
    { "$ref":"/schemas#/$defs/envelope_type"}, 
    { "properties": {
      "data": {
        "$ref":"/schemas/profile#/$defs/touch_type"
      }
    }
  ]
}

核心原因:JSON Schema新版本的$ref规则调整

这是因为你使用的是JSON Schema Draft 2020-12(以及2019-09)版本,这个版本对$ref的行为做了关键调整:

  • 在Draft 07及更早的版本中,$ref是"独占"的——只要Schema里出现了$ref,其他所有关键字都会被忽略,只有$ref指向的Schema规则生效。这时候如果要组合规则,必须用allOf。
  • 但从Draft 2019-09开始,$ref不再忽略同对象内的其他关键字了。验证器会把$ref引用的Schema内容,和当前对象里的其他关键字(比如这里的properties)进行合并,等效于自动帮你做了allOf的组合逻辑。

换句话说,你写的第一个Schema,和第二个用allOf的写法是完全等价的——新版本的规范允许你把$ref和其他关键字直接写在同一个对象里,验证器会自动合并规则,所以不需要显式用allOf。

内容的提问来源于stack exchange,提问作者JohnDoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 15:03:23