如何为含同属性列表及固定元素的JSON定义JSON Schema?
JSON Schema 复用结构与固定数组定义方案
复用通用元素结构
利用JSON Schema的$defs关键字提取TYPE_S和TYPE_C元素的共同字段,实现代码复用:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "A": { "type": "string" }, "B": { "type": "string" }, "C": { "type": "string" }, "TYPE_S": { "type": "array", "items": { "$ref": "#/$defs/CommonItem" }, "minItems": 1 // 按需添加:限制TYPE_S至少有一个元素 }, "TYPE_C": { "const": [ { "ID": "C1", "X": "x", "Y": "y", "Z": "z" }, { "ID": "C2", "X": "x", "Y": "y", "Z": "z" } ], "items": { "$ref": "#/$defs/CommonItem" } // 可选:确保固定元素符合通用结构 } }, "required": ["A", "B", "C", "TYPE_S", "TYPE_C"], "$defs": { "CommonItem": { "type": "object", "properties": { "ID": { "type": "string" }, "X": { "type": "string" }, "Y": { "type": "string" }, "Z": { "type": "string" } }, "required": ["ID", "X", "Y", "Z"] } } }
核心逻辑说明
- 结构复用:通过
$ref引用#/$defs/CommonItem,让TYPE_S的数组项和TYPE_C的固定元素共享同一套字段规则,后续修改通用字段只需调整$defs中的定义,无需重复修改多处。 - TYPE_C固定值约束:使用
const关键字强制TYPE_C必须完全匹配指定的数组内容,包括元素顺序、每个字段的取值,确保其始终固定不变。 - 灵活调整约束:TYPE_S默认支持可变长度的数组,若需限制元素数量,可添加
minItems/maxItems;required数组指定必须存在的顶级字段,可根据实际需求增减。
验证规则
- TYPE_S:数组内每个元素符合
CommonItem结构即可,元素数量可按需调整(若有minItems/maxItems则需满足对应限制)。 - TYPE_C:必须严格匹配
const定义的数组,任何字段值修改、元素顺序变更或数量变化都会导致验证失败。
内容的提问来源于stack exchange,提问作者P. Solar
相关产品推荐
相关产品推荐

