如何使用JSON Schema定义组合唯一属性以校验重复JSON文档
关于JSON Schema实现组合唯一键校验的解答
核心结论
原生JSON Schema本身不支持跨文档的组合唯一键校验。JSON Schema的设计作用域是单个待校验的JSON实例,只能校验单个文档的结构、取值范围等规则,无法访问你已经存储的其他历史数据,因此没办法直接通过标准Schema规则完成重复存在性校验。
自定义Schema扩展实现方案
你提到的通过扩展Schema加标记的方法是完全可行的,只需要自己补充对应的业务校验逻辑即可,推荐两种扩展方式:
方式1:顶层定义组合唯一键(更直观易维护)
直接在Schema顶层加x-前缀的自定义字段声明组合键,符合通用扩展规范,不会和标准字段冲突:
{ "$schema": "http://json-schema.org/2020-12/schema", "title": "pokemon", "description" : "a simple pokemon test", "type": "object", "properties" : { "name":{ "type":"string" }, "owner":{ "type":"string" }, "color":{ "type":"string" } }, "x-composite-unique-keys": [["owner", "color"]] }
方式2:属性级加布尔标记(符合你描述的需求)
给需要加入唯一组合的属性加自定义布尔标记:
{ "$schema": "http://json-schema.org/2020-12/schema", "title": "pokemon", "description" : "a simple pokemon test", "type": "object", "properties" : { "name":{ "type":"string" }, "owner":{ "type":"string", "x-is-unique-part": true }, "color":{ "type":"string", "x-is-unique-part": true } } }
具体校验流程
- 先用标准JSON Schema校验器校验传入的POST请求体结构是否合法,不合法直接返回错误
- 解析你的Schema扩展字段,拿到需要做唯一性校验的属性组合:
- 如果用顶层字段,直接读取
x-composite-unique-keys里的属性列表 - 如果用属性级标记,遍历所有属性筛选出
x-is-unique-part为true的字段组成组合键
- 如果用顶层字段,直接读取
- 到你的存储层查询是否已经存在同时匹配该组合键所有属性取值的记录
- 存在则返回重复错误拒绝保存,不存在则执行正常写入逻辑
注意事项
自定义扩展字段统一用x-前缀是行业通用规范,可以避免和后续JSON Schema新增的标准字段产生冲突。
内容的提问来源于stack exchange,提问作者Chilis
相关产品推荐
相关产品推荐

