一、格式化到底做了什么
JSON 是一种纯文本数据格式,压缩后的 JSON 把所有空白、换行都去掉了,机器读起来没问题,人读起来很痛苦。格式化(美化 / pretty print)就是按层级重新插入缩进和换行,让对象和数组的结构一目了然;压缩(minify)则相反,去掉所有非必要空白以减小传输体积。两者都不会改变数据本身,只改变文本的排版。
需要注意:格式化不是「修复」。如果文本本身不是合法 JSON,任何格式化工具都只会告诉你哪里错了,而不会擅自帮你改对。所以「格式化」和「校验」通常是同一个动作的两面:能解析成功就输出美化结果,解析失败就报告错误位置。
二、六类最常见的语法错误
- 用了单引号:JSON 标准要求字符串必须用双引号,
{'name': '张三'}是非法的,必须写成{"name": "张三"}。 - 尾随逗号:对象最后一项或数组最后一个元素后面多了一个逗号,例如
{"a":1,}、[1,2,]。JS 对象字面量允许,JSON 不允许。 - 写了注释:JSON 不支持
//或/* */注释,配置文件里想加说明只能另建字段。这是从 YAML/JS 配置转过来时最常犯的错。 - 键名没加引号:
{name: "张三"}非法,键必须也是双引号字符串。 - 引号未转义:字符串内部出现双引号要写成
\",反斜杠要写成\\;直接粘贴带换行的文本也会破坏结构。 - 多了或少了括号:括号不匹配时,报错位置往往在文件末尾而不是真正出错的地方,需要往前找。
三、如何按行列定位报错
浏览器里 JSON.parse() 抛出的错误通常带有 position(字符偏移量)或 line/column 信息。定位方法是:把报错位置之前的文本截取出来,数出换行符个数得到行号,再用最后一个换行符之后的字符数得到列号。好的在线工具会直接把这一步算好,并高亮出错附近的内容。
// 浏览器控制台示例
try { JSON.parse(txt); }
catch (e) { console.log(e.message); }
// Unexpected token } in JSON at position 137
经验法则:报错在「某个字符」时,问题往往在它前面一两个字符——比如多了一个逗号、少了一个引号,解析器要读到下一个 token 才发现不对。
四、实际操作建议
把原始文本粘贴进 JSON 格式化校验工具,先点「校验 / 格式化」,如果报错就按提示的行列回到原文修改;改完再点「压缩」得到可贴回代码或请求体里的单行版本。整个过程在浏览器本地完成,接口数据、token 之类的敏感内容不会上传到任何服务器,这一点对调试生产环境的返回尤其重要。
如果需要把接口返回的数组整理成表格给运营看,可以用 JSON 与 CSV 互转;要对比两个版本接口差异,用 JSON 比对比肉眼逐行看可靠得多。
五、大文件与编码注意
几 MB 以上的 JSON 在浏览器里美化会明显占内存,建议先按外层数组切片、或直接用命令行 jq 处理。另外 JSON 文本应以 UTF-8 保存,含中文时不要转成 GBK,否则会出现乱码;\uXXXX 形式的转义是合法的,格式化工具一般会保留原样或还原成可读字符。
小结
记住三句话:格式化只改排版不改数据;校验失败先看报错位置前一个字符;含敏感数据的接口结果用本地工具处理,不要贴到第三方在线服务。掌握这三点,绝大多数 JSON 报错都能在几分钟内解决。