工具使用常见问题:数据、文件与导出
数据会不会上传、能处理多大文件、存不存本地、中文为什么变成 \u4e2d,这十个问题把在线 JSON 工具的行为边界讲清楚。
把站内工具与 JSON 规范里被问得最多的问题按场景归拢,每个问题给出能直接照做的答案,而不是泛泛而谈的结论。
25 篇文章数据会不会上传、能处理多大文件、存不存本地、中文为什么变成 \u4e2d,这十个问题把在线 JSON 工具的行为边界讲清楚。
注释能不能写、尾逗号为什么报错、键名要不要加引号、9007199254740993 为什么变样,十二条结论全部对照 RFC 8259 给出。
路径查询该用 JSONPath 还是 Pointer、Patch 与 Merge Patch 怎么取舍、Schema 能拦住哪些错误、draft 版本怎么选,一次讲透。
几十 MB 的 JSON 为什么打不开、深拷贝有多贵、__proto__ 污染怎么防、XSS 从哪里进来,十条急救结论按症状排列。
RFC 8259 没有注释语法,`//` 与 `/* */` 都会让 JSON.parse 直接抛错。要写说明只有四条路:换 JSON5/JSONC、把备注塞进数据字段、写进 Schema 的 description,或改用 YAML。
尾逗号在 JavaScript 里合法,在 JSON 里是语法错误。本文给出报错原文、RFC 依据、三种改法,以及为什么不要靠「删逗号」蒙混过接口。
UTF-8 BOM 是不可见的三个字节 EF BB BF,JSON.parse 见到就直接抛错,而且错误位置通常报在第 1 行第 1 列,看着像文件是空的。本文讲清成因、判断方法和批量清除的手段。
JSON 只有十进制数字字面量,没有 NaN、Infinity、-Infinity。JSON.stringify 会静默把它们变成 null,接口里因此出现过大量「明明是数字却收到 null」的故障。
超过 2^53-1 的整数在 IEEE 754 双精度里无法精确表示,JSON.parse 会静默把末位改掉。订单号、雪花 ID、金额分单位都踩过这个坑,正确解法是全程当字符串传。
\u4e2d\u6587 是合法的 Unicode 转义,不是编码错误。真正的乱码是「测试」这种。分清两者,才知道该改序列化配置还是改文件编码。
三者是严格包含关系:JSON 是标准,JSONC 只多注释,JSON5 还多单引号、无引号键、尾逗号、十六进制与多行字符串。选错格式的代价通常在「接口不认」而不是「读不出来」。
JSON 用括号划边界、YAML 用缩进表达层级。机器交互选 JSON,人写配置选 YAML;两者可以互转,但注释、锚点、多文档这些特性在转换中会丢。
JSON Pointer 是「唯一路径」,写法固定、能直接当 key 用;JSONPath 是「查询语言」,支持通配、递归、过滤。选错的典型症状是拿 JSONPath 去做配置读写,或者拿 Pointer 去做批量筛选。
Schema 管的是结构和类型,管不了业务语义。它能把「字段缺失、类型错、枚举越界」挡在入口,但「金额为负、结束时间早于开始时间」这类规则,得靠代码校验。
2020-12 是当前推荐版本,`$defs`、`prefixItems`、`unevaluatedProperties` 都在这里;但很多老校验器、代码生成器仍只认 draft-07。选版本的依据不是新旧,而是「链路上每个工具都支持哪个」。
用 json-schema-to-typescript 或 quicktype 一条命令就能产出 .d.ts,但生成结果只是起点:可选字段、联合类型、`additionalProperties` 的映射都需要人工确认,否则类型看着对、用起来处处报错。
优化顺序错了,换什么库都没用。先量出时间花在解析、渲染还是请求上,再按「减少解析次数 → 流式处理 → 挪到 Worker → 换二进制格式」逐级加码。
攻击者把 `__proto__` 当普通键传进来,深拷贝或合并函数一递归,原型就被改了。之后全站对象都多出攻击者控制的属性,轻则逻辑错乱,重则绕过权限判断。
JSON 本身不会执行,XSS 发生在「把 JSON 当 HTML 用」的那一步。服务端拼页面、前端用 innerHTML、把 JSON 直接塞进 `<script>` 标签,是三个最常见的入口。
判断一个在线 JSON 工具是否会传数据,不用看隐私政策,看网络面板就够了:格式化时有没有 XHR 请求、页面能不能断网使用、数据在刷新后是否还在。
没有统一上限,真正卡住你的是浏览器标签页的内存预算:一份 20MB 的 JSON 解析后通常膨胀到 60–100MB,再叠加渲染节点,几百 MB 就崩了。
三种常见结构各有代价:裸返回最简洁但扩展时要破坏兼容;固定信封安全但冗余;JSON:API 规范完整但重。中小型项目最实用的是「HTTP 状态码表结果 + 固定信封包业务数据」。
时间戳和字符串各有取舍,但混用一定出事。推荐统一用 ISO 8601 带时区偏移(或 UTC 的 Z 结尾),存储用 UTC,展示在前端按用户时区转换。
`null` 表示「这个字段存在,但没有值」,省略表示「这个字段不存在」。PATCH 接口、配置合并、前端表单回填三处最容易因此出错,判断标准是「消费方需不需要知道这个字段被显式清空」。