修复 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)才容忍。
JSON 修复指南
主题中心
- JSON Parse Errors: Read the Message, Jump to the Fix
- Fix Invalid JSON: From 'What's Wrong' to a Clean File
- JSON Formatter, Validator, Viewer: Pick the Right Tool
- Repair LLM JSON Output: Handling Almost-JSON from AI
- Privacy: JSON Tools That Don't Leave Your Browser
- JSON Interop: YAML, CSV, XML, JWT, Schema
具体指南
- 如何解码 Base64 字符串(以及 JWT Payload)
- URL 编码:百分号编码查询参数与路径
- 将 YAML 转为 JSON(并避免缩进错误)
- 将 JSON 转为 CSV:把对象数组扁平化
- 将 JSON 转为 XML:根元素、属性与数组
- 将 JSON 转义为字符串字面量(并解码双重编码的 JSON)
- 修复 JSON 中的尾随逗号
- 修复 JSON 中的单引号
- 修复 LLM 输出的 JSON
- 修复 JSON 解析错误:Expected Property Name
- JSON 与 JavaScript 对象字面量的区别
- 在发起 API 请求前校验 JSON
- JSON 格式化器 vs JSON 修复工具
- 修复 JSON Unexpected Token 错误
- JSON 转 JavaScript 对象转换器