void 项目内置 VSCode JSON Language Server 深度解析:能力、配置与 LSP 集成指南
2026/9/10 14:05:28 网站建设 项目流程

void 项目内置 VSCode JSON Language Server 深度解析:能力、配置与 LSP 集成指南

【免费下载链接】void开源AI代码编辑器,Cursor的替代方案。项目地址: https://gitcode.com/GitHub_Trending/void2/void

导读

本文以extensions/json-language-features/server/README.md为核心,系统梳理 void 开源 AI 代码编辑器内置的 JSON 语言服务器(vscode-json-languageserver)的全部能力与配置项,并对照仓库源码(jsonServer.ts)验证其底层实现。读完本文,你将掌握:JSON/JSONC 两种文档语言的语义差异、服务器对外提供的全部 LSP 能力与客户端前置条件、初始化选项与运行时 Settings 的完整字段语义、基于 JSON Schema 的补全/校验/取色机制,以及如何将语言服务器以独立进程方式集成到任意编辑器或 IDE 中。

一、JSON Language Server 是什么

JSON Language Server 为 JSON 文档的编辑、校验与理解提供语言级智能能力。它作为一个独立可执行程序运行,通过实现语言服务器协议(Language Server Protocol,LSP)与任意代码编辑器或 IDE 建立连接,从而实现一次实现、处处复用的语言工具链。

在本仓库中,该服务器是内置扩展json-language-features的一部分,随 void 一起分发。客户端侧入口见 jsonClientMain.ts:扩展激活时以TransportKind.ipc方式启动server/dist|out/node/jsonServerMain作为独立进程,并在打开第一个 JSON 文件时正式启动服务器。

二、支持的文档语言:json 与 jsonc

服务器只处理语言标识为jsonjsonc的文档,二者在解析与校验规则上存在明确差异(对应实现位于 jsonServer.ts 的validateTextDocument函数):

语言标识解析规则校验规则
json严格遵循 JSON 规范注释与尾随逗号均视为错误(comments: 'error', trailingCommas: 'error'
jsonc额外接受单行注释//与多行注释/* ... */注释被忽略,尾随逗号仅给出警告(comments: 'ignore', trailingCommas: 'warning'

JSONC(JSON with Comments)是 VSCode 生态特有的文件格式,主要用于编辑器自身的配置文件(如settings.jsonlaunch.json),并未试图定义新的通用文件格式。因此在使用 void 编写普通 JSON 数据时,应保持无注释、无尾随逗号的严格写法;而在编写 JSONC 配置时则可自由使用注释。

三、服务器能力清单

服务器在initialize阶段根据客户端能力动态声明自身能力(见 jsonServer.ts 的capabilities对象):

3.1 核心 LSP 能力

  • 代码补全(Completion):基于文档关联的 JSON Schema 或文档内已有属性/值提供补全,触发字符为":。补全依赖客户端的snippetSupport能力,若客户端不支持,服务器不会声明补全能力。
  • 悬停提示(Hover):基于 Schema 中字段的描述信息,在悬停时展示值/属性的说明。
  • 文档符号(Document Symbols):支持快速导航到文档中的属性;当客户端支持层级文档符号(hierarchicalDocumentSymbolSupport)时使用树形结构返回。
  • 颜色装饰(Document Colors):基于 Schema 识别颜色值,凡是标注了"format": "color-hex"的值(这是 VSCode 特有的非标准 JSON Schema 扩展)都被视为颜色,支持#rgb[a]#rrggbb[aa]两种格式;配套的 Color Presentation 用于驱动颜色选择器。
  • 代码格式化(Formatting):支持整文档格式化与区间格式化,可动态注册。
  • 折叠范围(Folding Ranges):计算文档中全部可折叠区间。
  • 语义选区(Selection Ranges):为单个或多个光标位置计算语义选区。
  • 跳转定义(Goto Definition):支持跳转到 JSON Schema 中$ref引用的定义处。
  • 诊断(Diagnostics):对所有打开文档推送诊断,包含语法错误与基于 Schema 的结构校验。
  • 文档链接(Document Links):识别文档中的可跳转链接。
  • 代码操作(Code Actions):提供 "Sort JSON" 排序动作(见onCodeActionjson/sort请求)。

3.2 诊断的推送与拉取双模式

诊断支持两种分发模式(validation.ts):

  • 推送模式:客户端不支持textDocument.diagnostic拉取能力时启用。文档内容变化后以500ms 防抖validationDelayMs = 500)触发校验,文档关闭时清空该文档诊断。同一 URI 的旧校验请求会被替换,避免过期的异步校验结果覆盖新结果。
  • 拉取模式:客户端声明诊断拉取能力时启用,通过connection.languages.diagnostics注册处理器,Schema 变化时调用diagnostics.refresh()通知客户端重新拉取。

3.3 客户端前置条件

  • 服务器期望客户端只对其发送json/jsonc文档的请求。
  • 补全:需要客户端具备textDocument.completion.completionItem.snippetSupport能力,否则不声明补全。
  • 格式化:需要客户端支持rangeFormatting的动态注册(dynamicRegistration),否则不提供格式化能力;格式化能力的声明还受初始化选项provideFormatter控制。

四、初始化选项(Initialization Options)

客户端可在initialize请求中携带以下初始化选项:

选项类型语义
provideFormatterboolean \| undefined若显式定义,则直接决定是否在初始化时声明documentRangeFormattingProvider;若为undefined,则交由设置项json.format.enable决定,并通过动态注册方式挂载格式化器。客户端不支持动态注册时无格式化能力可用
handledSchemaProtocolsstring[]由服务器自行处理的 URI 协议列表,未列出的协议请求会转发给客户端(详见下文 Schema 配置)
customCapabilities.rangeFormatting.editLimitnumber出于性能考虑,限制区间格式化返回的编辑次数上限(formatterMaxNumberOfEdits)。当编辑数超过该上限时,服务器会把全部编辑合并为一次整文档替换

从源码看(jsonServer.ts),handledSchemaProtocolsprovideFormatter只在初始化时读取,运行期间不可变更;formatterMaxNumberOfEdits同样在初始化时取自customCapabilities

五、运行时 Settings 完整说明

客户端可通过workspace/didChangeConfiguration通知向服务器下发设置变更。服务器在onDidChangeConfiguration中统一处理(jsonServer.ts)。完整设置结构如下:

{ "http": { "proxy": "", "proxyStrictSSL": true }, "json": { "format": { "enable": true }, "validate": { "enable": true }, "schemas": [ { "fileMatch": [ "foo.json", "*.superfoo.json" ], "url": "http://json.schemastore.org/foo", "schema": { "type": "array" } } ], "resultLimit": 10000, "jsonFoldingLimit": 5000, "jsoncFoldingLimit": 5000 } }

5.1 http 段

  • proxy:拉取 Schema 时使用的代理服务器 URL。为空或未定义时不使用代理。该值通过runtime.configureHttpRequests注入request-light库(见 jsonServerNodeMain.ts)。
  • proxyStrictSSL:是否使用系统 CA 列表校验代理服务器证书,默认true

5.2 json 段

  • format.enable:是否注册格式化能力。仅当客户端支持rangeFormatting动态注册且initializationOptions.provideFormatter未定义时生效。源码中动态注册/注销DocumentRangeFormattingRequestDocumentFormattingRequest(jsonServer.ts)。
  • validate.enable:是否执行校验,默认true(未设置时按启用处理)。
  • schemas:文件到 Schema 的关联配置,每个条目包含:
    • fileMatch:文件名或路径数组(以/分隔),*可作通配符,!开头表示排除模式。匹配规则为:存在至少一个模式匹配,且最后一个匹配模式不是排除模式时才算命中。
    • folderUri:可选。提供后仅当文档位于该文件夹内(直接或子目录)时关联才生效。
    • url:Schema 的 URL,与schema同时提供时可省略。
    • schema:内联 Schema 内容,可选。从源码看,未提供url时服务器会使用 Schema 的id或自动生成vscode://schemas/custom/${index}作为其 URI(jsonServer.ts)。
  • resultLimit:颜色装饰与大纲符号的最大计算数量,用于性能保护。源码中用Math.trunc(Math.max(settingValue, 0))做归一化,未设置时无上限。
  • jsonFoldingLimit/jsoncFoldingLimit:分别限制 json / jsonc 文档的折叠区间计算数量;未设置时回退到 LSP 初始化参数textDocument.foldingRange.rangeLimitfoldingRangeRangeLimitDefault)。
  • 补充项(README 未列但源码已实现):jsonColorDecoratorLimit/jsoncColorDecoratorLimit可分别限制两种文档的颜色装饰数量;keepLines.enable控制格式化时是否保留空行(传入options.keepLines)。

六、Schema 配置与自定义 Schema 内容交付

JSON Schema 是补全、悬停、颜色装饰正常工作的前提,也是结构校验的必需输入。服务器定位文档对应 Schema 的机制依次为:

  1. 文档自身的$schema属性声明 Schema URL;
  2. Settings 中基于文档 URL 的schemas关联(可关联 URL,也可直接内联 Schema);
  3. 客户端通过自定义json/schemaAssociations通知下发的关联。

6.1 handledSchemaProtocols 与默认加载行为

Schema 以 URL 标识。服务器决定自行加载还是委托客户端加载,依据是初始化选项handledSchemaProtocols

let clientOptions: LanguageClientOptions = { initializationOptions: { handledSchemaProtocols: ['file'] // 语言服务器只自行加载 file URL } // ... }

未设置该选项时,服务器默认自行处理以下协议(与源码中getSchemaRequestService的默认参数['https', 'http', 'file']一致):

  • http/https:通过 Node.js HTTP 能力加载(实际由request-lightxhr实现,followRedirects: 5,见 jsonServerNodeMain.ts),代理行为受http.proxy等设置控制;
  • file:通过 Node.jsfs模块读取本地文件。文件不存在时抛出 "Schema not found",路径指向目录时抛出 "is a directory, not a file" 的本地化错误(jsonServerNodeMain.ts)。

其余协议的 Schema 请求全部转发给客户端。

6.2 非标准 LSP 扩展(vscode-json-languageserver 私有协议)

为支持 Schema 内容的灵活交付,服务器定义了三组私有协议扩展(均见 jsonServer.ts):

Schema 内容请求:客户端收到无法自行加载的 Schema URL 时,向客户端发起 LSP 请求:

  • method:vscode/content
  • params:string,即请求的 Schema URL
  • response:string,该 URL 对应的 Schema 内容

Schema 关联通知:客户端通过通知动态下发关联,方法为json/schemaAssociations,参数为ISchemaAssociations(对象形式)或ISchemaAssociation[](数组形式):

interface ISchemaAssociations { /** * 键为文件名或文件路径(以 / 分隔),* 可作通配符; * 值为 Schema URI 数组 */ [pattern: string]: string[]; } interface ISchemaAssociation { /** * Schema 的 URI,同时也是该 Schema 的标识符 */ uri: string; /** * 与该 Schema 关联的文件路径模式列表,* 可作通配符, * 以 ! 开头的为排除模式。例如 '*.schema.json'、'package.json'、'!foo*.schema.json'。 * 存在至少一个匹配模式且最后一个匹配模式不以 ! 开头时命中 */ fileMatch: string[]; /** * 提供后仅当被校验文档位于该文件夹内(直接或子目录)时关联生效 */ folderUri?: string; /** * 该 URI 对应的 Schema 内容。未提供时通过 schema 请求服务获取 */ schema?: JSONSchema; }

Schema 内容变更通知:客户端感知到某 Schema 内容已变化时,通过方法json/schemaContent(参数为该 Schema 的 URL)通知服务器。服务器会调用languageService.resetSchema(uri)清除缓存,待下次使用时重新加载,并在缓存被清除后触发诊断刷新(diagnosticsSupport.requestRefresh())。

此外源码中还实现了三个辅助请求:json/validate(对指定文档强制重新校验)、json/validateContent(以临时 URI 校验一段 Schema + 内容)、json/languageStatus(获取某文档关联的 Schema 列表)与json/sort(JSON 排序)。

6.3 性能保护:Item Limit

  • resultLimit:限制颜色符号与文档符号的计算数量;
  • jsonFoldingLimit/jsoncFoldingLimit:分别限制 json / jsonc 文档折叠区间的计算数量。

所有限制均作用于单次请求响应,避免超大 JSON 文件拖垮编辑器。此外,解析结果缓存(languageModelCache.ts)默认最多缓存10个文档的解析树,并每60 秒清理一次过期条目(getLanguageModelCache(10, 60, ...)),进一步控制内存占用。

七、独立集成:以命令行方式启动

若要把 JSON 语言服务器集成进其他编辑器或 IDE,可以先确认 LSP 客户端社区是否已有现成集成方案;也可以直接以命令行方式启动服务器并自行连接。安装方式:

npm install -g vscode-json-languageserver

安装后以vscode-json-languageserver命令启动,并通过命令行参数指定通信通道(与 package.json 中声明的bin.vscode-json-languageserver对应):

vscode-json-languageserver --node-ipc vscode-json-languageserver --stdio vscode-json-languageserver --socket=<port>

三种通道分别对应 Node IPC、标准输入输出(stdio)与 TCP Socket。服务器主体逻辑集中在startServer(connection, runtime)(jsonServer.ts),runtime负责注入平台相关的文件/HTTP 请求服务与定时器;Node 环境入口 jsonServerNodeMain.ts 提供fsrequest-light实现,浏览器环境入口 jsonServerMain.ts 则基于BrowserMessageReader/BrowserMessageWriter以 Web Worker 方式运行,说明同一套服务器代码可同时部署于桌面端与 Web 端。

八、参与开发与依赖关系

服务器源码位于本仓库extensions/json-language-features/server目录,多数功能实现沉淀在可复用库中:

  • jsonc-parser:JSON/JSONC 的解析器与扫描器;
  • vscode-json-languageservice:全部语言特性的可复用实现(getLanguageServicedoCompletedoValidationformatfindDocumentColors等均来自该库);
  • vscode-languageserver-node:Node.js 语言服务器的 LSP 基础设施(ConnectionTextDocuments等)。

当前服务器版本为 1.3.4(见 package.json),核心依赖为jsonc-parser@^3.3.1vscode-json-languageservice@^5.4.4vscode-languageserver@^10.0.0-next.12request-light@^0.8.0vscode-uri@^3.0.8,并基于@vscode/l10n实现本地化(本地化包位置由环境变量VSCODE_L10N_BUNDLE_LOCATION注入)。README 说明本项目遵循 Microsoft Open Source Code of Conduct,代码基于 MIT 许可证分发(与仓库根目录 LICENSE.txt 一致)。

九、快速上手建议

  1. 在 void 内直接使用:无需任何安装,打开任意.json/.jsonc文件即自动获得补全、校验、格式化与颜色装饰能力;通过编辑器设置按上文json.*段调整行为。
  2. 为项目接入自定义 Schema:在设置中为json.schemas添加fileMatch+url条目,或通过$schema属性声明,即可为你的配置文件获得补全与结构校验。
  3. 集成到自有编辑器:安装vscode-json-languageserver后用--stdio--socket启动,客户端实现初始化选项、Settings 通知及vscode/content请求即可获得完整能力。
  4. 调优性能:对超大 JSON 文件,通过resultLimitjsonFoldingLimitjsoncFoldingLimit限制计算量;在内网环境拉取 Schema 时配置http.proxy

【免费下载链接】void开源AI代码编辑器,Cursor的替代方案。项目地址: https://gitcode.com/GitHub_Trending/void2/void

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询