必须同时满足显式绑定schema路径、纯json语言模式、合法schema三者,否则静默失效;验证方法是输入非法字段看是否有红色波浪线和hover提示。

VSCode 对 JSON 文件做 Schema 校验,不是“开了就能用”的功能,而是必须显式绑定 Schema 路径 + 正确语言模式 + 合法 Schema 三者同时满足,缺一不可。静默失效是常态,报错反而是例外。
怎么确认当前文件正在走 Schema 校验路径
右下角状态栏显示的不是“JSON with Comments”或“Plain Text”,必须是纯 JSON。点它切换,选第一个“JSON”(没后缀、没 C 的那个)。如果文件已打开再切换,得保存或重新打开才生效——旧缓存不会自动重载校验逻辑。
验证是否真在跑校验:在目标 JSON 文件里输一个 Schema 里根本不存在的字段名,比如 Schema 只定义了 "host" 和 "port",你硬写个 "hostname",看有没有红色波浪线和 hover 提示。没有?那大概率根本没连上 Schema。
为什么加了 $schema 字段却没反应
$schema 是最直接的绑定方式,但 VSCode 对路径协议极其挑剔:
- 绝对本地路径如
"C:\schemas\config.json"或"D:/schemas/config.json"—— 直接忽略,不报错也不提示 - 相对路径只认
"./schemas/config.schema.json"(相对于当前 JSON 文件所在目录) - file:/// 协议必须三个斜杠,Windows 下盘符大写:
"file:///D:/proj/schemas/config.schema.json" - URL 必须返回 HTTP 200,且
Content-Type是application/schema+json或application/json
常见静默失败原因:路径含中文/空格没 URL 编码、$schema 写在注释块里、文件还没保存(VSCode 不对未保存内容触发校验)。
不改源文件时,如何强制绑定 Schema
很多部署配置、CI 模板、自定义 config 文件你没法加 $schema 字段,这时必须靠 .vscode/settings.json 中的 json.schemas 配置:
-
fileMatch是 glob 模式,**相对于工作区根目录**,不是文件系统根目录。写"**/deploy.json"才能匹配任意子目录下的 deploy.json;写"deploy.json"只匹配项目根下那个 -
url支持file:///、https://、或相对路径(如"./schemas/deploy.schema.json"),但注意:这个相对路径是相对于工作区根,不是相对于settings.json文件 - 如果
fileMatch没命中,VSCode 完全不吭声,只会“没反应”——这是最常被忽略的失效点
示例有效配置:
"json.schemas": [
{
"fileMatch": ["**/ci-config.json"],
"url": "file:///D:/myproject/schemas/ci.schema.json"
}
]
Schema 本身出问题会拖垮整个校验链
一个语法错误的 Schema(比如少逗号、Tab 缩进、$ref 指向的子文件不存在),会导致 VSCode 完全跳过该校验,不报错、不提示、不补全——你以为是配置错了,其实是 Schema 坏了。
排查建议:
- 打开开发者工具(
Ctrl+Shift+P→Developer: Toggle Developer Tools),在 Console 里搜schema或404,看有没有加载失败日志 - 用
ajv validate命令行工具或jsonschemalint.com先验证 Schema 文件本身是否合法 - 如果主 Schema 用了
$ref,所有被引用的子 Schema 都得能被 VSCode 访问到。要么把它们也加进json.schemas配置里(哪怕url指向同一个文件),要么统一改成file:///绝对路径写法,避免相对路径解析歧义
深层 $ref 或远程引用(尤其是 HTTPS)会明显拖慢补全响应,编辑大型配置时容易卡住——这不是 bug,是设计限制,得靠拆分 Schema 或本地化引用缓解。











