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

JSON Schema数组oneOf引用校验异常:非法项未被拦截

JSON Schema数组元素校验异常排查与修复
  • 问题根源:你大概率是把anyOf的层级放错了,或者items字段的定义不符合规范。比如错误地将items设为包含channel和router的数组(这是tuple类型的写法,仅校验对应位置的元素),而非单个schema(校验数组所有元素),就会出现混合合法/非法项时校验通过的情况。

  • 正确的Schema写法示例:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "anyOf": [
          {"$ref": "#/$defs/channel"},
          {"$ref": "#/$defs/router"}
        ]
      }
    }
  },
  "$defs": {
    "channel": {
      "type": "object",
      "required": ["channelId"],
      "properties": {
        "channelId": {"type": "string"}
      }
    },
    "router": {
      "type": "object",
      "required": ["routerId"],
      "properties": {
        "routerId": {"type": "string"}
      }
    }
  }
}
  • 错误写法对比(导致问题的常见情况):
    如果你的items写成下面这样,只会校验数组第一个元素符合channel、第二个符合router,后续元素无约束,自然会放过非法项:
"items": [
  {"$ref": "#/$defs/channel"},
  {"$ref": "#/$defs/router"}
]
  • 验证逻辑说明:
    当items是单个schema对象时,JSON Schema会要求数组的每一个元素都必须满足该schema的约束(这里就是匹配channel或router任意一个);而如果items是数组形式,则是tuple校验规则,仅对应位置的元素需要匹配对应schema,超出定义长度的元素默认不受约束(除非额外设置additionalItems: false)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:44:57