使用JSON Schema与AJV验证数组属性唯一性(大小写敏感)
区分大小写的labels.name唯一性验证(JSON Schema Draft 2007)
你可以借助AJV对Draft 2007的扩展支持,用原生关键字组合实现区分大小写的name属性唯一性验证,不用写自定义验证器,具体方案如下:
核心思路
通过allOf、not、contains加上AJV的$data扩展关键字,对数组中的每个元素做校验:确保数组里没有其他元素的name值和当前元素完全一致(区分大小写)。
示例Schema
{ "type": "object", "properties": { "labels": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "value": { "type": "string" } }, "required": ["name", "value"] }, "allOf": [ { "$ref": "#/properties/labels/definitions/uniqueCaseSensitiveName" } ], "definitions": { "uniqueCaseSensitiveName": { "not": { "contains": { "properties": { "name": { "$data": "1/name" } }, "required": ["name"], "not": { "$ref": "#" } } } } } } }, "required": ["labels"] }
关键部分解释
allOf:约束数组中所有元素都必须遵循定义的唯一性规则not + contains:检查数组内不存在另一个元素,其name值和当前元素的name(通过$data: "1/name"引用)完全匹配;not: { "$ref": "#" }是为了排除当前元素本身,避免误判$data:AJV的扩展关键字,用来引用当前校验元素的name值,需要在初始化AJV时开启该选项
启用AJV的$data支持
初始化AJV实例时要打开$data开关,否则无法使用该关键字:
const Ajv = require('ajv'); const ajv = new Ajv({ $data: true });
这样配置后,sampleId和SAMPLEID这类大小写不同的name会被视为不同值,符合你的需求;如果出现完全相同的name(包括大小写),则校验不通过。
内容的提问来源于stack exchange,提问作者parv bhardwaj
相关产品推荐
相关产品推荐

