如何为含动态属性的嵌套对象映射创建JSON Schema
解决动态属性嵌套的JSON Schema定义问题
我正好处理过类似的场景,核心是利用JSON Schema的patternProperties或additionalProperties来约束动态属性的结构,同时通过required关键字确保必填字段存在。下面是针对你的需求一步步构建的完整Schema:
完整的JSON Schema
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "required": ["messages"], "properties": { "id": { "type": "string" }, "messages": { "type": "object", // 如果你的动态属性有命名规律(比如都以book开头),用patternProperties匹配 "patternProperties": { "^book.*": { "type": "object", "required": ["default"], "properties": { "default": { "type": "object", "required": ["channels"], "properties": { "channels": { "type": "object", // channels下的每个渠道(sqs/sns/s3等)都要符合这个结构 "additionalProperties": { "type": "object", "required": ["enabled", "topic", "shares"], "properties": { "enabled": { "type": "boolean" }, "topic": { "type": "string" }, "shares": { "type": "boolean" } }, // 禁止渠道对象有额外的未定义属性(可选,根据需求调整) "additionalProperties": false } } }, "additionalProperties": false } }, "additionalProperties": false } }, // 如果动态属性没有命名规律,就用additionalProperties替代patternProperties: // "additionalProperties": { ... 这里放上面^book.*对应的结构 ... }, // 确保messages至少有一个动态属性(可选) "minProperties": 1 } }, "additionalProperties": false }
关键部分解释
顶层结构优化:
- 用
required: ["messages"]替代你之前的anyOf写法,更直接地强制messages为必填字段。 - 可选设置
additionalProperties: false,防止顶层出现未定义的额外属性,保证结构严谨性。
- 用
messages下的动态属性处理:
- 若动态属性有命名规则(比如都以
book开头),用patternProperties配合正则^book.*匹配所有符合规则的属性,确保每个属性都遵循统一结构。 - 若属性名称无规律,直接用
additionalProperties指定所有额外属性必须符合定义的结构,不管属性名是什么都会被约束。
- 若动态属性有命名规则(比如都以
动态属性内部必填项约束:
- 每个动态属性对象必须包含
default字段,通过required: ["default"]强制。 default对象必须包含channels字段,同样用required: ["channels"]约束。
- 每个动态属性对象必须包含
渠道结构统一约束:
- 用
additionalProperties定义每个渠道(如sqs、sns)必须包含enabled(布尔型)、topic(字符串)、shares(布尔型)三个必填字段,确保所有渠道结构一致。 - 可选设置
additionalProperties: false,禁止渠道对象出现未定义属性,避免不符合预期的字段混入。
- 用
这个Schema完全能验证你提供的示例JSON,同时支持添加更多类似bookXXX的动态属性,只要每个属性的结构符合定义即可。
内容的提问来源于stack exchange,提问作者VelNaga
相关产品推荐
相关产品推荐

