如何正确设置JSON Schema属性使其本身为JSON Schema对象?
正确声明属性为JSON Schema对象的方法
你的核心思路其实是对的,但可能需要几个细节的澄清和优化。下面一步步帮你梳理:
为什么你的代码其实是可行的?
通过$ref引用JSON Schema的元schema(也就是专门描述JSON Schema本身的schema),是声明某个属性必须是合法JSON Schema对象的标准方式。你用的http://json-schema.org/draft-07/schema#确实是draft-07版本元schema的正确地址,这段代码在语法上完全没问题。
如果你觉得它“有误”,大概率是因为你的JSON Schema验证器默认没有自动加载远程的元schema,导致验证时出现报错。这种情况下,你需要手动配置验证器来加载这个元schema,或者将元schema的内容本地导入(不过后者会让你的schema变得非常冗长,不推荐)。
优化后的代码示例
可以给外层对象加上additionalProperties: false,确保不会出现多余的未定义属性,让schema更严谨:
{ "type": "object", "description": "Describe request/response", "properties": { "requestSchema": { "$ref": "http://json-schema.org/draft-07/schema#" }, "replySchema": { "$ref": "http://json-schema.org/draft-07/schema#" } }, "additionalProperties": false }
关于Hyper Schema的疑问
Hyper Schema是JSON Schema的扩展,主要用于描述RESTful API的链接、交互规则等场景,和你现在“声明某个属性是JSON Schema对象”的需求完全不相关。你不需要在这里用到它,用普通的元schema引用就足够解决问题。
额外提示(如果用新版本JSON Schema)
如果你使用的是2020-12或更新版本的JSON Schema,元schema的地址会变成https://json-schema.org/draft/2020-12/schema,写法类似:
"requestSchema": { "$ref": "https://json-schema.org/draft/2020-12/schema" }
内容的提问来源于stack exchange,提问作者Starfish_mod
相关产品推荐
相关产品推荐

