如何格式化、校验和转换 JSON
JSON 是 Web 的默认数据交换格式,而它有一个总把人绊倒的特性:它是给机器设计的,不是给人读的。 任何 API 的响应都是一行套着括号的嵌套结构,人类没法用眼睛解析。
格式化不是装饰。它是“五秒钟找到你要的字段”和“横向滚动四千个字符”之间的差别。
为什么压缩过的 JSON 读不了
一份 JSON 文档是一棵树——对象里装着键、值和其他对象。压缩输出把这棵树压成一行,同时抹掉了唯一能告诉你“谁在谁里面”的视觉线索:缩进。
格式化器把它重新展开,带缩进、一个键一行、值对齐。信息量一模一样,可读性天差地别。 多数格式化器还会给字符串、数字、布尔值和 null 上色,让你一眼看出类型不匹配。
JSON 格式化工具在浏览器里做这件事:粘贴或拖入文件,它会美化输出并同时校验。没有任何上传——这一点比听起来重要,见下文关于秘密的说明。
最常让 JSON 报错的几类问题
JSON 的语法是刻意严格的,它会拒绝好几样在 JavaScript 里合法的东西。下面这些造成的困惑最多:
尾逗号。 {"a": 1, "b": 2,} 是非法的。JavaScript 接受它,JSON 不接受。这是“我的 JSON 坏了”最常见的原因。
单引号。 JSON 要求键和字符串都用双引号。{'a': 1} 非法。
注释。 JSON 没有注释语法。// 和 /* */ 都是错误。如果你需要注释,你要找的是 JSON5 或 JSONC——它们是扩展,不是 JSON。
没加引号的键。 {a: 1} 非法,必须写成 {"a": 1}。
undefined、NaN、Infinity。 JSON 里都不存在。最接近的合法值分别是 null,以及对于后两者用字符串或数字替代。含有这些值的 JavaScript 对象在序列化时会变成 null 或者直接抛错,取决于序列化器。
未转义的控制字符。 字符串里的真实换行是非法的,必须写成 \n。
文件开头的 BOM。 有些编辑器会加。JSON 解析器会拒绝它。如果一个文件在某个工具里能解析、在另一个里失败,先查 BOM。
校验
格式化其实就是校验:格式化器必须解析输入才能重新缩进,所以它失败的地方,正是校验器会拒绝的地方。
失败时你真正需要的是位置,而不只是“JSON 非法”。能报出行号和列号的格式化器,把“找”变成“改”;只给一句错误信息,就只能让你对着四千个字符手工二分。
在 JSON 和 CSV 之间搬数据
两种格式服务不同的对象。JSON 表达嵌套的树,CSV 表达扁平的表。互相转换是常规操作,摩擦点永远是同一个问题:嵌套怎么办?
JSON → CSV。 如果你的对象是扁平的({"name": ..., "email": ...}),映射很直接:键变成列头,每个对象变成一行。如果嵌套了,你必须决定:拍平(把嵌套路径拼成带点的列名)、丢掉嵌套数据,还是把它序列化成字符串塞回单元格。不同工具做不同选择——去检查输出,别默认。
CSV → JSON。 反向是明确的:行变成对象,表头变成键。有两点要注意:CSV 里的一切都是字符串,数字和布尔值需要重新定型;源文件的分隔符或引号问题会让列静默错位。
两个都在本地运行。对于一份含客户记录的数据集,这就是“分析你的数据”和“分发你的数据”之间的区别。
在你想不到的地方出现的 JSON
JWT 就是 JSON。 一个 JSON Web Token 是由点号分隔的三段 base64url 编码:头部、载荷、签名。前两段解码出来就是普通 JSON。JWT 解码工具能让你不需要签名密钥就看到头部和载荷。
最后这半句才是重点,也是安全课。 载荷是编码的,不是加密的。任何拿到这个 token 的人都能读它。永远不要把真正机密的东西放进 JWT 载荷——它对每个持有 token 的客户端可见,也对任何截获它的人可见。
Base64 同样不是加密。 Base64 编码工具存在的意义是让二进制数据能通过纯文本通道存活。它不提供任何机密性,把它当成混淆手段是一个常见且代价高昂的错误。
比较两份 JSON 文档
对两个压缩过的 JSON 文件做 diff 毫无用处——只要一个键换了位置,后面每一行都会不同。真正能用的流程:
- 先格式化两份文档,让它们结构上可比。
- 用文本对比工具对比格式化后的版本。
- 记住 JSON 对象的键顺序没有意义。diff 显示某个键“移动”了,不是语义上的变更。
一条适用于以上全部的隐私提醒
API 响应里装着凭据。访问令牌、会话 ID、内部网址、客户记录、个人数据,都是 JSON 载荷里的常客。
把这样一份东西粘进服务器端的格式化工具,等于把它发给了第三方。 这整类风险在在线文件转换工具安全吗里讲过,只是这里用在了最可能携带秘密的那一类文本上。
上面链接的每个工具都在本地处理。验证方式一样:打开 Network 面板、执行操作、确认没有任何请求携带你的数据。
常见问题
为什么我的 JSON 解析失败? 十次里有九次是尾逗号、单引号字符串,或者注释。之后检查文件开头的 BOM,以及字符串里未转义的控制字符。
JSON 和 JavaScript 对象是一回事吗?
不是。JSON 是一个严格的子集。合法的 JSON 通常也是合法的 JavaScript,但大量合法的 JavaScript——注释、尾逗号、不带引号的键、undefined——都不是合法的 JSON。
怎么把嵌套 JSON 转成 CSV? 你必须做选择:把嵌套路径拍平成带点的列名、丢掉嵌套值,或者把它们序列化成字符串塞进单元格。无论工具怎么做,都去检查输出——静默丢数据是常见的失败方式。
JSON 里能写注释吗? 在 JSON 里不能。JSON5 和 JSONC 允许注释,某些配置格式(尤其是较早的 TypeScript 配置)接受 JSONC。原生 JSON 解析器会拒绝它们。
把 API 响应粘进在线格式化工具安全吗? 只有粘进本地运行的才安全。API 响应里经常有令牌和个人数据。看着 Network 面板验证,或者用一个从不发请求的工具。
JWT 是什么,它加密了吗? JWT 是由三段 base64url 编码组成的令牌。它是签名的,不是加密的——载荷对任何持有该 token 的人都是可读的。永远不要在它里面放秘密。