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

能否为存储映射的不定长偶数元素数组创建JSON Schema?

如何创建约束偶数长度键值对数组的JSON Schema

可以创建满足需求的JSON Schema,针对你描述的旧API数组格式,以下是两种可行方案:

方案1:使用$data关键字(推荐)

如果你的JSON Schema实现支持$data(比如AJV等主流解析库),可以直接引用数组的length属性强制偶数长度,同时约束键值对的顺序和类型:

{
  "type": "array",
  "minItems": 0,
  // 定义第一组键值对的类型
  "prefixItems": [
    { "type": "string" }, // 替换为实际需要的键类型
    { "type": ["string", "number", "boolean"] } // 替换为实际需要的值类型
  ],
  // 后续元素必须重复键-值的模式
  "additionalItems": {
    "oneOf": [
      { "type": "string" }, // 和前缀的键类型保持一致
      { "type": ["string", "number", "boolean"] } // 和前缀的值类型保持一致
    ]
  },
  // 强制数组长度为偶数
  "allOf": [
    {
      "$data": "length",
      "multipleOf": 2
    }
  ]
}

这个方案能精准满足需求:

  • 数组长度必须是偶数(包括空数组)
  • 元素严格遵循键-值的成对顺序
  • 键和值的类型可根据实际需求自定义

方案2:不依赖$data关键字(兼容旧实现)

如果你的环境不支持$data,可以通过not关键字排除所有奇数长度的数组,同时约束元素模式:

{
  "type": "array",
  "minItems": 0,
  "prefixItems": [
    { "$ref": "#/definitions/key" },
    { "$ref": "#/definitions/value" }
  ],
  "additionalItems": {
    "oneOf": [
      { "$ref": "#/definitions/key" },
      { "$ref": "#/definitions/value" }
    ]
  },
  // 排除长度为1的奇数数组
  "not": {
    "minItems": 1,
    "maxItems": 1,
    "items": { "$ref": "#/definitions/key" }
  },
  // 排除长度为3的奇数数组
  "not": {
    "minItems": 3,
    "maxItems": 3,
    "prefixItems": [{}, {}, { "$ref": "#/definitions/key" }]
  },
  // 可继续扩展排除更长的奇数长度,不过这种方式较繁琐
  "definitions": {
    "key": { "type": "string" },
    "value": { "type": ["string", "number", "boolean"] }
  }
}

这种方法需要手动覆盖可能的奇数长度场景,灵活性不足,仅作为兼容方案使用。

验证示例

  • 合法实例:["name", "Alice", "age", 30](长度为偶数,键值对顺序正确)
  • 非法实例:["name", "Alice", "age"](长度为奇数,被拒绝)
  • 非法实例:["name", 30, "Alice"](顺序错误,第三个元素不符合键类型,被拒绝)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:09:29