Format, explore and convert JSON safely.
在浏览器里校验、浏览并转换 JSON:精确到行列的报错、面对超大文件依然流畅的可折叠树、JSONPath 查询,以及导出为 CSV、XML、YAML、JSON Schema 或 TypeScript。
在左侧粘贴或拖入 JSON 即可开始。
工作原理
把 JSON 拿进来
粘贴、拖入文件,或由另一个工具直接递过来。什么都不会上传,重活也不会在你开口之前启动。
看结论
要么有效,要么给出出错的确切行列,另外还有重复的键和 JavaScript 存不下的数字。
翻一翻
折叠树、按键或值筛选,或者对整份文档跑一条 JSONPath 表达式。
带走它
CSV、XML、YAML、JSON Lines、JSON Schema、TypeScript 或 Go 类型,也可以直接送去另一个工具。
真正的解析器,不是 JSON.parse
报错会给出行、列,并在行号栏高亮那一行,而不是丢给你一个还得自己数的字符偏移量。
64 位标识符不会走样
长数字标识符会逐位原样写回。任何基于 JSON.parse 的格式化工具都会悄悄把它们四舍五入到最近的双精度值。
一键修复
注释、多余逗号、单引号、未加引号的键、Python 的 True/False/None,以及跑错地方的 BOM,都会变成严格 JSON。
JSONPath 查询
通配符、递归下降、切片,以及 [?(@.price > 10)] 这类过滤条件,全部手写解释:你输入的内容永远不会被执行。
从真实数据得出类型
JSON Schema、TypeScript 接口或 Go 结构体,都会通读所有记录后推断,因此偶尔缺席的字段会成为可选项。
诚实的扁平化
你决定路径分隔符,以及嵌套数组的去向。空对象会保留自己的列,而不是从导出结果里消失。
结构化对比
两份文档逐条路径比较,键的顺序不同不会被算成上千处改动。
大文件依然好用
校验搬进 Web Worker,树只挂载屏幕上看得见的行,撤销记录保存改动的字符而不是整份文档的副本。
Format, explore and convert JSON safely.
API 响应里带着令牌、客户资料和内部标识符。JSONFlow 不会把这些送到任何地方:解析器、树、查询和导出都在这个标签页内运行,所以把生产环境的响应粘进来,和在自己的编辑器里打开一样私密。
一切都在这个标签页里运行
解析器、可折叠树、JSONPath 引擎和每一种导出,都是在你设备上运行的普通 JavaScript。没有上传步骤,没有后端,也没有任何带着你数据的请求:页面加载完之后断网,工具照样能用。
面向开发者的完整 JSON 工作台。
找出那一个把配置文件搞坏的逗号,把 API 响应变成表格,为没人写过文档的接口生成 TypeScript 接口,确认同一份数据的两个版本是否真有差别,以及打开那些 JSON 被包在带引号字符串里的日志。
JSON 数据几乎从不是匿名的:里面有访问令牌、邮箱地址、订单号和内部接口地址。把它粘进托管在别处的格式化网站,等于把这一切交给别人的服务器。在这里它不会离开标签页,也就没有什么可记录、可缓存或可泄露的。
常见问题
Q我的 JSON 会被发送到服务器吗?+
不会。解析、校验、树、查询和所有导出都在这个浏览器标签页内运行。页面加载完之后你可以断开网络,一切照常工作。
Q它实际能处理多大的文件?+
在一台普通笔记本上,一份 1.5 MB、包含 18 万个节点的文档解析耗时远低于十分之一秒,几十兆字节的文件也仍然打得开:校验搬进了 Web Worker,树只绘制屏幕上看得见的行。真正的上限是内存而不是工具:超过大约 100 MB 之后,用任何程序浏览器标签页都会吃力。凡是超过 2 MB 的文件都会拦在一个按钮后面而不是自动加载,所以大文件永远不会在送进来的瞬间把页面卡住。
Q为什么我的长标识符在别的工具里会变?+
JSON.parse 会把每个数字变成 64 位浮点数,而它无法精确表示大于 2^53 的整数——Twitter、Discord 或 Snowflake 的标识符会丢掉最后几位。JSONFlow 保留原文中的数字,并在数值进入这个区间时给出提醒。
Q我的文件里有注释和多余逗号,会有问题吗?+
不会。严格解析失败时会自动再跑一遍宽容解析,若能成功就会出现“修复”按钮。它能处理注释、多余逗号、单引号、未加引号的键、Python 的 True/False/None、NaN 和 Infinity,并把文档改写成严格 JSON。
QJSON 转 CSV 的扁平化是怎么做的?+
最外层数组的每个元素变成一行,嵌套的键变成 user.address.city 这样带点的列名。分隔符由你选择,嵌套数组可以每项一列、保持 JSON 原样或拼接起来。反过来时表头按字面处理:除非你明确要求还原嵌套,first_name 这一列就一直是 first_name。
Q查询栏里可以写什么?+
JSONPath 的一个子集:$.users[0].name、用 [*] 的通配符、用 .. 的递归下降、[0:5] 这样的切片、负数下标,以及 [?(@.price > 10)] 或 [?(@.name =~ ^a)] 这类过滤条件。表达式由程序自己解释,绝不会当作代码执行。