最直接的自定义悬停说明方式是在 json 文件顶层添加 $schema 字段,指向合法 json schema 的 url 或本地路径;vscode 据此提供字段提示、校验和悬停文档,但需注意路径相对性、schema 格式合法性及光标必须位于 key 上才能触发悬停。

JSON 文件里加 $schema 是最直接的自定义悬停说明方式
VSCode 的 JSON 语言服务会在你打开一个 JSON 文件时,自动读取 $schema 字段指向的 JSON Schema,并据此生成字段提示、类型校验和悬停文档。这个字段必须是顶层键,且值为 URL 或本地路径(支持 file:// 协议)。
常见错误现象:写了 "$schema": "./schema.json" 却没提示——因为路径是相对于当前 JSON 文件位置的,不是相对于项目根目录;如果 schema 文件不存在或格式非法,悬停会静默失效,不报错也不提示。
- 推荐用绝对路径或远程公开 schema(如
"https://json.schemastore.org/tsconfig"),避免相对路径歧义 - 本地 schema 文件必须是合法 JSON,且以
{ "type": "object", ... }开头,不能有 BOM 或注释 - VSCode 不会缓存损坏的 schema;改完 schema 后需保存 JSON 文件,再把光标移出/移回字段才能刷新悬停
用 json.schemas 在 settings.json 里绑定文件和 Schema
当你无法修改目标 JSON 文件(比如团队规范禁止提交 $schema)、或要为无扩展名配置文件(如 .env.json)补提示时,就得走用户/工作区设置这条路。它本质是「编辑器主动挂载 schema」,不依赖文件内容。
关键点在于 fileMatch 的写法:它匹配的是文件**完整路径**,不是 glob 模式。例如 "/package.json" 只匹配项目根目录下的 package.json,而 "/*.json" 匹配所有 JSON 文件——但后者容易误伤,慎用。
-
url可以是http://、https://或file:///full/path/to/schema.json - 如果 schema 存在语法错误,VSCode 会在「问题」面板报
Unable to load schema from …,但悬停依然空白 - 多个匹配规则按数组顺序生效,后写的会覆盖前面同路径的规则(不合并)
内联写 schema:适合极简验证,但悬停信息有限
在 settings.json 的 json.schemas 数组里直接嵌入 schema 定义,跳过网络或文件加载,适合字段少、结构固定的私有配置(如 CI 脚本参数)。但它生成的悬停说明非常基础——只有 description 字段会被显示,enum、default、examples 全部不出现。
示例片段:
"json.schemas": [
{
"fileMatch": ["/.taotoken"],
"schema": {
"type": "object",
"properties": {
"model": {
"type": "string",
"description": "模型名称,如 gpt-4o"
},
"base_url": {
"type": "string",
"description": "API 基础地址,末尾不要带斜杠"
}
}
}
}
]
- 这种写法无法复用、难维护,仅建议用于临时调试或单人小项目
-
description必须是字符串,不能是 Markdown 或换行;多行描述会被截断 - 如果 schema 中漏了
required,VSCode 不会标红必填字段,只靠悬停文字提醒
为什么悬停没显示 schema 里的 description
最常被忽略的是:VSCode 的 JSON 悬停提示只响应「光标落在 key 名上」,而不是 value 上。比如你在 "model": "gpt-4o" 这行,光标停在 "gpt-4o" 里,什么都不会出来;必须移到 model 两个字母任意位置,才会弹出 description。
- 如果 key 是动态生成的(如
"${env:MODEL}"),VSCode 无法关联 schema,悬停必然为空 - 使用了
jsonc(JSON with Comments)模式时,//注释不会触发任何 schema 提示,只有真实 key 才行 - 装了 Copilot 或其他 AI 插件时,它们可能劫持 hover 响应——禁用后测试可快速定位是否冲突











