如何用JSON Schema定义存储未知JSON Schema的对象属性?
问题描述
需要编写JSON Schema来约束如下结构的对象:
{ "mySchema": { // 任意合法的JSON Schema } }
目前已经能把mySchema定义成普通对象类型,写法如下:
{ "type": "object", "properties": { "mySchema": { "type": "object" } } }
但现在想明确约束mySchema的值必须是任意合法的JSON Schema(不是普通对象或者特定的JSON Schema),想问这个需求能不能实现,以及正确的写法是什么。另外参考了JSON Schema 2020-12核心规范,自己写了一个尝试示例,需要确认这个示例是否合法:
{ "type": "object", "properties": { "mySchema": { "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema" } } }
解决方案与验证
- 需求可行性:完全可以实现,JSON Schema支持通过引用官方元Schema来验证某个值是否为合法的JSON Schema。
- 你的尝试示例不合法:
$schema是用来声明当前这个JSON Schema遵循的规范版本的关键字,它不是用来验证数据的验证关键字,把它放在mySchema的属性里,根本起不到验证该值是合法JSON Schema的作用。 - 正确实现方式:要约束
mySchema为任意合法的2020-12版本JSON Schema,得用$ref引用官方的元Schema,另外要注意JSON Schema本身可以是布尔值(true表示匹配所有数据,false表示不匹配任何数据),所以不能只限制type为object,得允许布尔类型。正确写法如下:
{ "type": "object", "properties": { "mySchema": { "$ref": "https://json-schema.org/draft/2020-12/schema" } }, "required": ["mySchema"] // 如果mySchema是必填项可以加上这一行 }
这里的$ref指向2020-12版本的元Schema,这个元Schema本身就是用来验证一个值是否为合法的2020-12 JSON Schema的,既能支持对象类型的Schema,也能支持布尔类型的Schema。
内容的提问来源于stack exchange,提问作者Luka Žitnik
相关产品推荐
相关产品推荐

