Zed 中 JSON / JSONC 的编辑体验:Schema 校验与 Prettier 格式化配置指南
本篇技术指南聚焦 Zed 编辑器对 JSON 与 JSONC 语言的内置支持,讲解从语法解析、语言服务器接入、package.json/tsconfig.json 自动 Schema 校验,到通过 $schema 与 settings.json 两种方式为任意 JSON 文件绑定校验 Schema,以及 .jsonc 文件使用 Prettier 格式化时尾逗号的规避方案。读完你可以在 Zed 中为 LSP、Zed 自身配置文件乃至自定义 JSON 格式获得「编辑器 + 校验 + 格式化」的一站式配置能力。
JSON 语言支持总览
JSON 支持在 Zed 中开箱即用(native support),不需要安装任何扩展:
- 语法解析:基于 tree-sitter-json 语法树,提供高亮、折叠、括号配对等编辑能力;
- 语言服务器:默认接入由 zed-industries 维护的 json-language-server,负责校验与格式化。
在代码层面,这两者分别对应 Zed 内置语言注册与 LSP 适配器。查看 crates/languages/src/lib.rs 可以看到内置语言表里同时注册了两种语言名称:
LanguageInfo { name: "json", adapters: vec![json_lsp_adapter.clone(), node_version_lsp_adapter], ... },
LanguageInfo { name: "jsonc", adapters: vec![json_lsp_adapter], ... },
注意 JSON 语言额外挂载了 node_version_lsp_adapter(package-version-server),它负责在编辑 package.json 这类文件时提供包版本等补充信息。
JSONC:允许单行注释的 JSON 超集
Zed 还支持 JSON 的超集 JSONC(JSON with Comments),即在 JSON 文件中允许出现 // 单行注释与 /* */ 块注释。Zed 自身的大量配置文件(如 settings.json、keymap.json、tasks.json)正是以此形式书写。
在 file_types 默认配置中,assets/settings/default.json 将这些常见配置文件默认归入 JSONC 语言:
"file_types": {
"JSONC": [
"**/.zed/*.json",
"**/.vscode/**/*.json",
"**/{zed,Zed}/{settings,keymap,tasks,debug}.json",
"tsconfig*.json"
]
}
因此你可以在这些文件里放心书写注释,而 Zed 自己的 schema 也会正确识别它们(见下文「Zed 内建 Schema 关联」)。
注释的快捷切换
在 JSONC 文件中,Zed 绑定了注释切换命令 editor::ToggleComments,可对当前行或选区添加/移除注释:
- macOS:
cmd-/ - Linux / Windows:
ctrl-/
对应的默认键位配置可分别在 assets/keymaps/default-macos.json("cmd-/": ["editor::ToggleComments", ...])与 assets/keymaps/default-linux.json("ctrl-/": ["editor::ToggleComments", ...])中找到。
JSONC 的 Prettier 格式化与尾逗号规避
当你在 Zed 中对 *.jsonc 扩展名文件执行 Format Document,或开启了 format_on_save(保存时自动格式化)时,Zed 默认会调用 Prettier 作为格式化器。默认设置层面,JSON 与 JSONC 两种语言的 formatter 都被允许使用 Prettier,见 assets/settings/default.json。
已知问题:.jsonc 文件的尾逗号
Prettier 上游存在一个公开 issue:当文件扩展名为 .jsonc 时,Prettier 会错误地给文件加上尾逗号。因为尾逗号只对 JSONC / JavaScript 这类语法合法,对严格 JSON 不合法,这会导致 JSONC 文件被「格式化」后反而变得不标准。需要注意的是:
- 只有扩展名为
*.jsonc的文件受影响; - 采用 JSONC 语法但扩展名仍为
.json的文件(例如.zed/settings.json)不受影响。
规避方案:在 .prettierrc 中 override
在项目根目录的 .prettierrc 配置文件中加入如下覆盖规则,即可让 Prettier 对 .jsonc 文件改用 json 解析器并关闭尾逗号:
{
"overrides": [
{
"files": ["*.jsonc"],
"options": {
"parser": "json",
"trailingComma": "none"
}
}
]
}
其中 "parser": "json" 让 Prettier 以严格 JSON 方式解析、避免产出注释或尾逗号相关的意外行为,"trailingComma": "none" 显式禁止添加尾逗号。该配置会随项目生效,覆盖使用 Zed 内置或项目安装的 Prettier 进行格式化时的默认行为。
JSON 语言服务器的接入机制
Zed 内置的 json-language-server 来自 zed-industries/json-language-server(基于 vscode-langservers-extracted 中的 VSCode JSON 语言服务器封装)。其完整接入逻辑位于 crates/languages/src/json.rs:
- 服务器入口位于
node_modules/vscode-langservers-extracted/bin/vscode-json-language-server(见 json.rs),由 Zed 通过内置 Node 运行时以 npm 自动下载安装vscode-langservers-extracted包; - 如果你在
$PATH中已安装了vscode-json-language-server,Zed 会优先检测并复用它,以--stdio参数启动(见 json.rs); - 语言服务器对 JSON 文件同时开启格式化与校验能力,并向服务器发送如下配置(见 workspace_configuration):
{
"json": {
"format": { "enable": true },
"validate": { "enable": true },
"schemas": []
}
}
- 若你配置了 HTTP 代理,Zed 还会把代理设置透传给语言服务器用于远程拉取 Schema(
json.http.proxy,见 json.rs); language_ids将 JSON / JSONC 两种语言分别映射为 LSP 侧的json/jsonc(见 json.rs)。
Zed 内建 Schema 关联(自动校验)
Zed 默认开箱即用地为 package.json 与 tsconfig.json 提供 JSON Schema 校验。这两份 schema 以内嵌资源形式编译进二进制:
tsconfig、package.json的 schema 通过include_str!从 crates/json_schema_store/src/json_schema_store.rs 中的schemas/tsconfig.json、schemas/package.json载入;- 在组装文件关联时,Zed 会无条件注册
tsconfig.json、package.json两条fileMatch规则(见 all_schema_file_associations)。
此外,Zed 还为自己生态内的配置类 JSON 文件预置了 schema 关联,例如 settings.json、keymap.json、tasks.json、snippets 等(见 json_schema_store.rs),编辑这些文件时同样能获得实时校验与补全。这也解释了为什么 JSON 语言的语言服务器适配器被标记为 is_primary_zed_json_schema_adapter(见 json.rs):它是 Zed 自身配置 schema 的一等接入者。
除上述内建能力外,json-language-server 也支持把项目文件中的 JSON Schema 定义、JSON Schema Store 提供的公共 schema,或任何可公开访问 URL 上的 schema 用于 JSON 文件校验。
方式一:在文件内通过 $schema 内联指定 Schema
如果你希望跟随文件本身携带 schema 信息(适合分发给他人使用、或文件位置固定),可以在 JSON 文件的顶层加入 $schema 键,指向你的 schema 文件地址。
以配合 lua-language-server 使用的 .luarc.json 为例:
{
"$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json",
"runtime.version": "Lua 5.4"
}
打开该文件后,Zed 的 json-language-server 会拉取该 schema,为 runtime.version 等字段提供校验、补全与悬停文档。
方式二:在 settings.json 中按路径关联 Schema
当你不希望在每个文件里都写 $schema 时,可以在 Zed 的 settings.json 中,为 lsp → json-language-server → settings 配置 json.schemas 数组,用 fileMatch 与 url 的配对把 schema 批量绑定到匹配的文件路径上:
{
"lsp": {
"json-language-server": {
"settings": {
"json": {
"schemas": [
{
"fileMatch": ["config/*.json"],
"url": "./schemas/custom-schema.json"
},
{
"fileMatch": ["*.config.json"],
"url": "~/global-schemas/shared.json"
},
{
"fileMatch": ["*/*.luarc.json"],
"url": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json"
}
]
}
}
}
}
}
fileMatch 支持 glob 通配模式;url 支持三种形式:
| url 前缀 / 形式 | 解析规则 | 示例 |
|---|---|---|
./ |
相对于工作区(worktree)根目录解析 | ./schemas/custom-schema.json → <项目根>/schemas/custom-schema.json |
~/ |
展开为你的主目录(home directory) | ~/global-schemas/shared.json → ~/. 主目录/global-schemas/shared.json |
https:// |
直接作为远程 URL 拉取 | Schema Store 或其他公共地址 |
路径解析的具体实现位于 crates/languages/src/json.rs 的 worktree_root 函数中:它遍历 settings 内 json.schemas 数组,把以 . 或 ~ 开头的 url 统一交给 resolve_relative_path 解析为绝对路径后再发送给语言服务器;其余形式(如完整 http(s)://)则原样透传。
透传 json-language-server 的全部受支持设置
除了 schemas,你还可以通过在 Zed 的 settings.json 中为 json-language-server 指定任意受支持设置,将其透传给语言服务器。例如:
{
"lsp": {
"json-language-server": {
"settings": {
"json": {
"validate": { "enable": true },
"format": { "enable": true },
"schemas": []
}
}
}
}
}
Zed 会把你提供的这部分 settings 与自身生成的默认配置做深合并(参见 workspace_configuration 中对 language_server_settings 的合并逻辑),因此你既可以只补充个别键,也可以整体覆盖默认行为。完整的可配置项以 json-language-server 官方 README 的 settings 清单为准。
验证与排查
配置是否真正生效,可以通过语言服务器日志直接观察 Zed 发送给 json-language-server 的完整配置。在 Zed 中执行命令面板里的 dev: open language server logs,选择 json-language-server 分组下的 Server Info,即可查看格式化、校验与全部 schema 关联是否按预期下发(该提示同样写在 json.rs 的源码注释中)。
小结
总结一下在 Zed 中解锁 JSON / JSONC 完整能力的三条主线:
- 开箱即用:JSON 与 JSONC 均为内置语言,语法解析、
json-language-server自动安装、package.json/tsconfig.json自动 schema 校验全部默认生效,JSONC 中可放心使用注释并按cmd-//ctrl-/快捷切换; - Schema 绑定:需要自定义校验时,单文件用顶层
$schema,批量场景在 settings.json 中通过json.schemas+fileMatch完成,./、~/、https://三类 url 分别解析为工作区路径、主目录路径与远程地址; - 格式化:
*.jsonc走 Prettier 时若出现尾逗号,在.prettierrc中以parser: "json"+trailingComma: "none"的 override 规则规避即可。
延伸阅读
- 语言服务器适配器实现:crates/languages/src/json.rs
- JSON / JSONC 语言注册:crates/languages/src/lib.rs
- 内建 Schema 关联与 Zed 配置类文件 schema:crates/json_schema_store/src/json_schema_store.rs
- JSONC 默认文件类型与格式化允许配置:assets/settings/default.json
- 注释切换默认键位:assets/keymaps/default-linux.json、assets/keymaps/default-macos.json
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00