修复 JSON 中未加引号的键

即使像 name、active、profile 这样的标识符,在合法 JSON 里也必须加上引号。

为什么未加引号的键会出错

JavaScript 在对象字面量里允许使用裸属性名。JSON 不允许 —— 每个对象键都必须是带双引号的字符串。

出错示例

{ name: "Ada", active: true }

修复后的 JSON

{ "name": "Ada", "active": true }

为什么 JavaScript 标识符看起来像 JSON 键

在 JavaScript 对象字面量里,{ name: "Ada" } 是合法的,因为 name 是合法的标识符。JSON 去掉了这种「快捷写法」,让解析器对所有键只需要识别一种形状 —— 带引号的字符串。这样语法就足够简单,可以在任何语言里实现。

始终需要引号的键

即便解析器允许裸标识符,仍有不少键必须加引号:return、class 这样的保留字,含有连字符或点的名称,以数字开头的名称,以及带组合字符或 emoji 的 Unicode 名称。对所有键加引号,正好绕开所有这些边界情况。

自动修复何时可以安全地给裸键加引号

修复工具只对出现在键位置的裸标识符加引号 —— 也就是直接跟在 { 或 , 后面、并且后面是 : 的标识符。它不会动已经加了引号的键、字符串值或字符串内部的文本,所以即便文档里同时混着合法和不合法的键,加引号也是安全的。

JSON5 与 JSONC

JSON5 和 JSONC(VS Code 配置使用的格式)都允许未加引号的键和注释。它们适合人工编辑的配置,但不适合作为数据交换格式 —— 永远不要通过 API 暴露 JSON5,标准客户端会拒绝。

FAQ

问:为什么我的 JSON 里有未加引号的键?答:通常是从 JavaScript 对象字面量复制过来的,或某个模板引擎忘记了加引号。问:package.json 里能不加引号吗?答:不行 —— package.json 是严格 JSON;只有 tsconfig.json(JSONC)才容忍。