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

如何用JSON Schema实现一组属性仅能指定一个的互斥校验及友好报错?

JSON Schema 属性互斥规则实现与报错优化方案

原写法问题说明

你最初的写法失效,是因为not {"required": ["two", "three"]}的校验逻辑是「仅当two和three同时存在时才会校验不通过」,所以同时指定两个属性的时候不会触发规则,只有三个属性同时存在才会报错。

正确的互斥规则基础实现

移除not配置后的oneOf写法已经可以满足互斥校验逻辑:

"oneOf": [
    {"required": ["one"]},
    {"required": ["two"]},
    {"required": ["three"]}
]

oneOf关键字要求数据恰好匹配其中一个子Schema:

  • 仅指定一个属性时,只会匹配对应子Schema,校验通过
  • 同时指定两个及以上属性时,会匹配多个子Schema,违反oneOf规则,校验失败
  • 未指定三个属性中任意一个时,不会匹配任何子Schema,校验失败

自定义友好报错提示

默认的oneOf报错非常笼统,你可以通过校验库的自定义错误消息能力配置精准提示,以下是最常用的AJV校验库的实现方案:

  1. 先安装ajv-errors插件(AJV官方提供的自定义错误扩展)
  2. 调整Schema配置,新增errorMessage字段:
{
  "type": "object",
  "properties": {
    "one": {"type": "string"},
    "two": {"type": "number"},
    "three": {"type": "boolean"}
    // 其他公共属性可以继续在这里定义
  },
  "oneOf": [
    {"required": ["one"]},
    {"required": ["two"]},
    {"required": ["three"]}
  ],
  "errorMessage": {
    "oneOf": "必须且仅能指定 one、two、three 中的一个属性"
  }
}

配置完成后,校验失败时会自动拼接上下文路径输出你需要的报错效果:

- myObj.0: 必须且仅能指定 one、two、three 中的一个属性

如果你使用其他JSON Schema校验工具,基本都支持类似的自定义错误消息配置,直接对应修改oneOf规则的报错文本即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:08