toolgarden.xyz
EN
JSON FormatterJSON.parseJSON.stringify

JSON Formatter 是怎么实现的?

从 JSON.parse、JSON.stringify 讲到错误处理、JSON5 fallback、树形视图和大文件边界。

ToolGarden 推荐的工具优先在浏览器本地运行,文件和文本不必上传到服务器,适合更注重安全隐私的日常处理。

发布于 2026年9月20日约 10 分钟阅读作者 ToolGarden

JSON Formatter 本质是“解析后重新序列化”,不是搜索替换。解析器先证明文本可以成为数据模型,序列化器再按选定空白规则输出一致表示。

两行演示很简单,生产行为还要处理空输入、语法错误、重复 key、JSON 变体、超大文档、树形渲染和敏感 Payload 是否离开浏览器。

最小处理链

JSON.parse 返回对象、数组、字符串、数字、布尔值或 null;JSON.stringify 遍历值并输出标准 JSON,第三个参数控制缩进,省略时得到压缩结果。

正则无法可靠区分字符串内花括号、转义引号、Unicode 转义和嵌套结构,必须先解析。

const parsed = JSON.parse(input);
const pretty = JSON.stringify(parsed, null, 2);
const minified = JSON.stringify(parsed);

格式化也会检查语法

JSON.parse 成功说明文本符合标准 JSON 语法;失败时应保留输入并展示错误,而不是生成半成品。

因此 Formatter 也能做语法校验,但不是 Schema Validator;没有契约时,它不知道 age 是否应为整数或 email 是否必填。

stringify 会规范化什么

原始空白、key 排版、转义方式和无意义的零不会保留。重复 key 尤其重要:JSON.parse 只保留最后一个值,之前内容无法恢复。

标准 JSON 不能表示 undefined、函数、Symbol、BigInt、NaN 或 Infinity;格式化内存值时需要明确策略。

JSONC/JSON5 需要明确模式

注释、尾逗号、单引号和未加引号 key 不是标准 JSON。JSON5 解析器可以读取再输出标准 JSON,但注释和源排版会消失。

ToolGarden 先尝试 JSON.parse,再处理支持的宽松语法;工具函数返回成功或错误联合类型,不直接操作 React 状态。

type Outcome =
  | { ok: true; output: string; parsed: unknown }
  | { ok: false; message: string };

树形视图与性能

树形组件递归渲染对象和数组,维护稳定路径、展开状态与类型着色,并与文本输出共享同一 parsed 值。

数千节点会阻塞渲染,应折叠深层、虚拟化长列表、限制递归或提供文本模式;大文档还可能需要 Worker 或体积限制。

错误与隐私契约

解析器错误因引擎而异。界面可以显示原生消息和估算位置,再解释逗号、引号、转义或截断问题,但不能假装修复总是确定。

浏览器本地解析避免上传,分享结果前仍需移除密钥。

  • 不要只用正则格式化。
  • 失败时保留原文。
  • 说明 JSON5/JSONC 规范化。
  • 提示重复 key 丢失。
  • 区分语法与 Schema 校验。

总结

可靠 Formatter 先解析、保留无效输入、序列化唯一 parsed 模型,并说明变体支持与规范化影响。核心代码简单,外围契约决定可信度。

常见问题

Q.stringify 能校验 JSON 吗?

JSON 文本的校验发生在 JSON.parse 成功时,stringify 负责序列化值。

Q.为什么注释消失了?

注释不是标准 JSON 数据,规范化时会丢弃。

Q.格式化会改变数据吗?

空白不会,但重复 key 和宽松语法需要注意。