input.json · editing
output.json · 2-space
修复会处理单引号、未加引号的键、尾随逗号、Python 字面量等等。

先修语法,再谈格式化

格式化工具没法美化它压根解析不了的文本。这个工具做的是前面那道更脏的活:解析常见的"近似 JSON"语法,在意图明确的地方把它转成严格 JSON,然后把输出排版好供你复核。

所以它很适合处理从源码里拷出来的 JavaScript 对象字面量、日志里的 Python 风格字典、手工改过的配置文件,或者被 Markdown 围栏包起来的 AI 回复。普通格式化器遇到第一个单引号或尾随逗号就停了,而 Repair & Format 的目标是把整份文档都归一化。

修复流程认得哪些错误

  • 单引号字符串,比如 'Ada'
  • 没加引号的对象键,比如 { name: "Ada" }
  • }] 前面的尾随逗号;
  • 从 Python 拷来的 TrueFalseNone
  • JavaScript 的行注释和块注释;
  • 包住 JSON 回复的 Markdown 代码围栏;
  • 十六进制数字,比如 0xFF

修复是刻意宽容的,JSON 校验器则是刻意严格的。两个配合着用。

一套靠谱的修复流程

  1. 去掉凭据,把输入裁到仍然能复现问题的最小样本。
  2. Repair & Format,把输出和输入对照着看。
  3. 逐一检查工具做了"理解性改动"的地方,尤其是字符串、数字和 null
  4. 对修复后的文本跑一遍严格校验器。
  5. 发到任何重要的地方之前,先拿应用的 schema 或 API 约定验证结果。

看看这段坏掉的输入:

{
  user: 'Ada',
  active: True,
  roles: ['admin',],
}

语法已经强烈暗示这是一个有三个字段的对象,所以修复风险很低:给键名和字符串加双引号、把 Python 的布尔值转过来、删掉末尾的逗号。但缺值就是另一回事了 —— 面对 { "limit": },没有任何通用工具能知道作者想写的是 0null、空字符串,还是别的什么。

语法修复不等于数据校验

就算是合法 JSON,对消费它的系统来说也可能是无效的。用户 ID 也许必须保持字符串,才能留住前导零。日期可能文本合法,时区却错了。逗号全都放对了,但多出来的一个属性,可能就改变了鉴权行为。

解析器接受这份文档之后,还要检查必填字段、类型、允许的取值、数组长度、null 的处理和未知的键。涉及权限、计费、删除等高影响操作时,请把修复后的载荷和一份已知正确的样本或正式 schema 对比。

本地处理,但该防的还得防

编辑器和修复引擎都在你的浏览器里运行,粘贴的文档不需要上传到 fixjson.org 的应用服务器才能处理。页面托管和分析统计与编辑器流程是分开的,详见隐私政策

本地处理确实降低了暴露面,但把调试样本脱敏依然是好的工程习惯。不要把机密、令牌、客户数据或生产环境标识粘贴到任何网站上。