如何在Draft-07版本的JSON Schema中自定义可全局使用的关键字(词汇)
如何在Draft-07版本的JSON Schema中自定义可全局使用的关键字(词汇)
我完全懂你的处境——VS Code目前只支持Draft-07,而新版JSON Schema那套$vocabulary、$dynamicAnchor的词汇扩展机制在Draft-07里根本没有,想自定义全局关键字确实有点卡壳。下面给你梳理一套在Draft-07里可行的实现方案:
核心思路:元模式扩展+复用引用
Draft-07没有官方的词汇系统,所以咱们得通过扩展基础元模式的方式,把自定义关键字的规则整合进去,让VS Code能识别并验证这些关键字。
1. 编写自定义关键字的元模式
先给你的自定义关键字定义语法规则,比如假设你要做一个x-required-if关键字(用来指定某个字段在特定条件下必填),可以写这样的元模式文件(比如命名为custom-keywords.meta.json):
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "x-required-if": { "type": "object", "properties": { "condition": { "type": "string", "description": "触发必填的条件表达式" }, "field": { "type": "string", "description": "需要必填的字段名" } }, "required": ["condition", "field"] } } }
这里用x-前缀是Draft-07的扩展惯例,避免和官方关键字冲突。
2. 扩展Draft-07的基础元模式
你需要创建一个扩展版的Draft-07元模式,把上面的自定义关键字规则合并进去。可以用allOf来组合官方元模式和你的自定义元模式,比如命名为extended-draft-07.meta.json:
{ "$schema": "http://json-schema.org/draft-07/schema#", "allOf": [ { "$ref": "http://json-schema.org/draft-07/schema#" }, { "$ref": "./custom-keywords.meta.json" } ] }
如果不想用引用,也可以直接拷贝官方Draft-07元模式的内容,然后在它的properties字段里直接添加自定义关键字的定义。
3. 在业务Schema中使用扩展元模式
现在你的业务Schema就可以指定使用这个扩展后的元模式了,比如:
{ "$schema": "./extended-draft-07.meta.json", "type": "object", "properties": { "isPremium": { "type": "boolean" }, "discountCode": { "type": "string" } }, "x-required-if": { "condition": "isPremium === true", "field": "discountCode" } }
4. 配置VS Code识别扩展元模式
最后要让VS Code知道用你的扩展元模式来验证文件,在项目的.vscode/settings.json里添加配置:
{ "json.schemas": [ { "fileMatch": ["*.schema.json"], // 匹配你的业务Schema文件 "url": "./extended-draft-07.meta.json" } ] }
注意事项
- 语法vs语义验证:Draft-07的这套方式只能帮你做语法验证(检查自定义关键字的格式是否符合规则),如果要实现真正的语义校验(比如判断
discountCode在isPremium为true时是否真的必填),你需要自己编写额外的验证逻辑——VS Code默认的验证器只支持官方关键字的语义判断。 - 关键字命名:坚持用
x-前缀,这是Draft-07的扩展规范,能避免和未来的官方关键字冲突。
备注:内容来源于stack exchange,提问作者dlukacic
相关产品推荐
相关产品推荐

