如何创建含未知属性的JSON Schema并校验嵌套对象值类型
实现方法
直接在数组项对应的对象节点使用additionalProperties关键字即可,该关键字专门用于约束对象下未提前声明名称的动态属性格式,支持任意嵌套层级使用,没有场景限制。
首先先修正你原有Schema里的语法错误:原代码中"items: 缺失闭合双引号,属于语法问题,运行校验前需要先修复。
核心规则说明:
- JSON Schema默认对象的属性名就是字符串类型,你不需要额外编写规则约束属性名的类型,除非需要对属性名的命名规则做正则匹配限制,可搭配
propertyNames实现,当前场景不需要额外配置。 additionalProperties的取值就是你要求的每个动态属性值对应的Schema规则,所有不在properties中显式声明的属性,都会自动套用这个规则做校验。- 如果你要求每个动态属性必须同时包含
value和ticker两个字段,不要漏写required配置,否则允许出现缺字段的对象。
完整可用Schema示例
{ "Stocks": { "description": "some stock data", "type": "array", "items": { "type": "object", // 约束当前对象下所有任意名称的属性,均符合下方结构要求 "additionalProperties": { "type": "object", "properties": { "value": { "type": "integer" }, "ticker": { "type": "string" } }, // 标记两个字段为必填,可根据实际业务需求决定是否保留 "required": ["value", "ticker"] } } } }
校验效果
- 完全保留属性名灵活性:数组的每个元素对象下,可以出现任意数量、任意字符串名称的属性,不需要提前在Schema中枚举。
- 强约束属性值格式:所有动态属性的值都会被校验,必须是对象结构,且包含整数类型的
value字段、字符串类型的ticker字段,不符合规则的返回会直接判定校验不通过。 - 兼容固定属性配置:如果后续你有几个固定名称的属性需要做差异化校验,直接把这些固定属性写在同层级的
properties下即可,additionalProperties只会对未在properties中声明的属性生效,二者不会冲突。
内容的提问来源于stack exchange,提问作者Sim Borodach
相关产品推荐
相关产品推荐

