为何未使用allOf的JSON Schema仍可生效?技术问询
为什么这个JSON Schema不用allOf也能生效?
我写了下面这个JSON Schema:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://my.assets/schemas/message", "$ref":"/schemas#/$defs/envelope_type", "properties": { "data": { "$ref":"/schemas/profile#/$defs/touch_type" } } }
其中envelope_type要求必须包含data字段,我在这里又进一步定义了data的结构。验证器判定这个Schema合法,实际测试的实例也符合预期,但我有点疑惑:为什么不用像下面这样用allOf把$ref和properties组合起来,也能正常生效?
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://my.assets/schemas/message", "allOf": [ { "$ref":"/schemas#/$defs/envelope_type"}, { "properties": { "data": { "$ref":"/schemas/profile#/$defs/touch_type" } } ] }
核心原因:JSON Schema新版本的$ref规则调整
这是因为你使用的是JSON Schema Draft 2020-12(以及2019-09)版本,这个版本对$ref的行为做了关键调整:
- 在Draft 07及更早的版本中,
$ref是"独占"的——只要Schema里出现了$ref,其他所有关键字都会被忽略,只有$ref指向的Schema规则生效。这时候如果要组合规则,必须用allOf。 - 但从Draft 2019-09开始,
$ref不再忽略同对象内的其他关键字了。验证器会把$ref引用的Schema内容,和当前对象里的其他关键字(比如这里的properties)进行合并,等效于自动帮你做了allOf的组合逻辑。
换句话说,你写的第一个Schema,和第二个用allOf的写法是完全等价的——新版本的规范允许你把$ref和其他关键字直接写在同一个对象里,验证器会自动合并规则,所以不需要显式用allOf。
内容的提问来源于stack exchange,提问作者JohnDoe
相关产品推荐
相关产品推荐

