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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:25:19