首页
/ Zed 中 JSON / JSONC 的编辑体验:Schema 校验与 Prettier 格式化配置指南

Zed 中 JSON / JSONC 的编辑体验:Schema 校验与 Prettier 格式化配置指南

2026-09-06 18:52:06作者:乔或婵

本篇技术指南聚焦 Zed 编辑器对 JSON 与 JSONC 语言的内置支持,讲解从语法解析、语言服务器接入、package.json/tsconfig.json 自动 Schema 校验,到通过 $schemasettings.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_adapterpackage-version-server),它负责在编辑 package.json 这类文件时提供包版本等补充信息。

JSONC:允许单行注释的 JSON 超集

Zed 还支持 JSON 的超集 JSONC(JSON with Comments),即在 JSON 文件中允许出现 // 单行注释与 /* */ 块注释。Zed 自身的大量配置文件(如 settings.jsonkeymap.jsontasks.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 作为格式化器。默认设置层面,JSONJSONC 两种语言的 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.jsontsconfig.json 提供 JSON Schema 校验。这两份 schema 以内嵌资源形式编译进二进制:

此外,Zed 还为自己生态内的配置类 JSON 文件预置了 schema 关联,例如 settings.jsonkeymap.jsontasks.jsonsnippets 等(见 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 中,为 lspjson-language-serversettings 配置 json.schemas 数组,用 fileMatchurl 的配对把 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.rsworktree_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 完整能力的三条主线:

  1. 开箱即用:JSON 与 JSONC 均为内置语言,语法解析、json-language-server 自动安装、package.json / tsconfig.json 自动 schema 校验全部默认生效,JSONC 中可放心使用注释并按 cmd-/ / ctrl-/ 快捷切换;
  2. Schema 绑定:需要自定义校验时,单文件用顶层 $schema,批量场景在 settings.json 中通过 json.schemas + fileMatch 完成,./~/https:// 三类 url 分别解析为工作区路径、主目录路径与远程地址;
  3. 格式化*.jsonc 走 Prettier 时若出现尾逗号,在 .prettierrc 中以 parser: "json" + trailingComma: "none" 的 override 规则规避即可。

延伸阅读

登录后查看全文
热门项目推荐
相关项目推荐