如何通过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
相关产品推荐
相关产品推荐

