如何在JSON Schema中验证payload属性为合法JSON Schema?
验证属性为合法JSON Schema的定义方法
需求背景
需要验证payload属性是一个合法的JSON Schema,示例的message结构如下:
message: name: userSignedUp version: 1.0.0 payload: name: type: string timestamp: type: string warningLevel: type: string enum: - HIGH - MEDIUM - LOW
现有问题
用户编写的JSON Schema中,payload引用了未正确定义的#/definitions/schema,代码如下:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "title": "Message", "properties": { "name": { "type": "string" }, "version": { "type": "string" }, "payload": { "$ref": "#/definitions/schema" } }, "definitions":{ "schema": { # --> How should the schema be defined? } }, "required":[ "name", "version", "payload" ] }
用户知晓需使用Core/Validation Dialect元Schema,但不清楚meta/*该替换什么,想了解#/definitions/schema的正确定义方式。
解决方案
要定义验证“合法JSON Schema”的Schema,核心是引用对应JSON Schema版本的元Schema(即描述Schema本身规则的Schema)。以下是针对Draft-07版本的两种实现方式:
方法1:直接引用元Schema
这是最简洁的方式,直接让schema定义指向Draft-07的元Schema,就能确保payload符合合法JSON Schema的规范:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "title": "Message", "properties": { "name": { "type": "string" }, "version": { "type": "string" }, "payload": { "$ref": "#/definitions/schema" } }, "definitions":{ "schema": { "$ref": "http://json-schema.org/draft-07/schema#" } }, "required":[ "name", "version", "payload" ] }
方法2:基于元Schema扩展自定义约束
如果需要在合法Schema的基础上添加额外规则(比如强制某些关键字必须存在),可以在引用元Schema的同时追加自定义约束:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "title": "Message", "properties": { "name": { "type": "string" }, "version": { "type": "string" }, "payload": { "$ref": "#/definitions/schema" } }, "definitions":{ "schema": { "$ref": "http://json-schema.org/draft-07/schema#", "required": ["type"] // 强制payload的Schema必须包含type关键字 } }, "required":[ "name", "version", "payload" ] }
版本适配说明
如果使用其他JSON Schema版本(如Draft-2020-12),只需将元Schema的URL替换为对应版本的地址即可,例如https://json-schema.org/draft/2020-12/schema。
内容的提问来源于stack exchange,提问作者RanAbitbul
相关产品推荐
相关产品推荐

