如何用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校验库的实现方案:
- 先安装
ajv-errors插件(AJV官方提供的自定义错误扩展) - 调整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
相关产品推荐
相关产品推荐

