能否为存储映射的不定长偶数元素数组创建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
相关产品推荐
相关产品推荐

