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

如何通过JSON Schema约束数组内所有对象拥有相同的键?

如何用JSON Schema约束数组内所有对象的键完全一致(实现二维数据表约束)

可以实现这个需求,通过JSON Schema的$data关键字(draft-07及以上版本支持),我们可以约束数组中所有对象的键集合与第一个对象完全匹配,不管键名具体是什么。

最终Schema示例

{
  "type": "array",
  "minItems": 1,
  "items": [
    {
      "type": "object",
      "minProperties": 1
    },
    {
      "type": "object",
      "required": { "$data": "0#" },
      "properties": { "$data": "0#" },
      "additionalProperties": false
    }
  ],
  "additionalItems": {
    "type": "object",
    "required": { "$data": "0#" },
    "properties": { "$data": "0#" },
    "additionalProperties": false
  }
}

规则解释

  • 数组基础约束:type: "array"指定目标是数组,minItems: 1确保数组至少有一行数据(空数组可根据需求移除该规则)。
  • 第一个对象规则:数组的第一个元素可以是任意非空对象(minProperties: 1避免空对象),它的键集合会作为后续所有对象的参照标准。
  • 后续对象约束:从第二个对象开始,所有元素必须满足:
    • required: { "$data": "0#" }:必须包含第一个对象的所有键(0#是JSON Pointer语法,引用数组第一个元素的所有键名)。
    • properties: { "$data": "0#" }:仅允许出现第一个对象中存在的键。
    • additionalProperties: false:禁止添加第一个对象没有的额外键。

验证效果

  • 符合要求的示例(所有对象键一致)会通过验证:
    [
      {"foo": "a", "bar": "b"},
      {"foo": "c", "bar": "d"}
    ]
    
  • 不符合要求的示例(键不匹配)会触发错误:
    [
      {"foo": "a", "bar": "b"},
      {"baz": "c", "bar": "d"}
    ]
    
    错误原因:第二个对象包含第一个对象没有的baz键,且缺少第一个对象的foo键。

注意事项

  • 该方案依赖JSON Schema draft-07及以上版本的$data关键字,使用前请确认你的验证工具支持该版本(比如Ajv、JSON Schema Validator等主流工具都支持)。
  • 如果需要统一约束所有对象的值类型,可以在第一个对象的规则中添加类型限制,或者修改properties的$data引用逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:22