JSON 格式化:语法校验与错误定位实践

JSON.parse 报 Unexpected token,到底错在第几个字符?

JSON 解析失败的根因,通常不是"数据有问题",而是"数据不是严格的 JSON"。

JSON 是 JavaScript 对象字面量的一个严格子集:键名必须用英文双引号包裹,字符串同样只能用双引号,对象或数组末尾不允许尾逗号,不支持注释,也不存在 undefined、NaN、Infinity 这些字面量。

前端最常踩的坑有三个:

一是 从控制台复制对象时把 {name: 'Tom'} 当成合法 JSON(单引号和无引号键名都不合法);

二是手写配置文件时在最后一项后面留了逗号,浏览器直接报错,而某些后端序列化库却宽容通过,于是问题只在前端暴露;

三是 把 JS 对象直接丢给 fetch 的 body,实际发出去的是 [object Object]。出错时控制台只给一行 Unexpected token } in JSON at position 137,position 是从 0 开始的字符偏移,靠肉眼数字符定位效率很低。

另一类更隐蔽的问题是数字精度:JSON 的数字按双精度浮点解析,安全整数上限是 2^53-1,后端用 int64 表示的订单号在前端会被静默截断,且不抛任何异常。下面以一个纯前端在线工具为例,演示从语法校验、错误定位到格式化输出的完整操作。

一、工具简介

使用盘子工具站的JSON格式化工具(打开工具)是一款在浏览器本地运行的 JSON 处理工具,支持美化、压缩、语法校验、错误定位,方便进行JSON格式数据进行快速验证。其核心能力:

  • 本地处理:所有计算在浏览器完成,数据不上传服务器
  • 格式化:按层级缩进展开,缩进可选 2 空格或 4 空格
  • 压缩:去掉全部无意义空白与换行,压成单行,便于传输与存储
  • 校验:对输入做语法校验,非法时给出错误定位,而不是笼统地报一句失败
  • 示例与复制:内置示例数据(含 name / tools / count 等字段),输出区支持一键复制

二、适用场景

  • 接口联调:后端返回一大段无换行的 JSON,先格式化再比对字段是否与文档一致
  • 排查解析报错:JSON.parse 抛异常时,用校验功能定位到具体出错位置再回去改
  • 配置文件整理:手写 JSON 配置时检查尾逗号、注释、单引号等不合法写法
  • 报文瘦身:把展开的报文压缩成单行,便于塞进日志或用 curl 复现请求

三、操作步骤

第一步: 打开 JSON格式化工具,页面分为左右两块,左侧是输入区,右侧是输出区,中间是操作按钮与缩进选项。

第二步: 在输入区粘贴待处理的 JSON。如果手头没有现成数据,点"示例"按钮,工具会填入一份包含 name、tools、count 等字段的示例数据,先熟悉流程再换自己的数据。

第三步: 在缩进选项中选择 2 空格或 4 空格。团队有规范就按规范来,没有则建议 2 空格。选好后点"格式化",输出区会按层级缩进展开,对象与数组的嵌套关系一眼可见。

第四步: 点"校验"按钮做语法检查。输入合法时给出通过提示;存在尾逗号、单引号、括号不匹配等问题时会给出错误定位,据此回到输入区修改对应位置即可。

第五步: 需要把 JSON 压成单行时,点"压缩"按钮,输出区变成去除全部多余空白的单行文本。压缩与格式化共用同一份输入,可以来回切换对比。

第六步: 确认无误后点输出区的"复制"按钮取走结果。要换一批数据时点"清空",输入区与输出区同时复位。

四、功能亮点

  • 校验与错误定位一体:不只说"解析失败",还指出出错位置,省去按 position 数字符的过程
  • 格式化与压缩双向切换:同一份输入既可展开阅读,也可压成单行,调试与上线两种形态一次处理完
  • 缩进可选 2 / 4 空格:适配不同团队的编码规范,避免提交后因为缩进风格被 Code Review 打回
  • 纯前端本地运算:接口报文、含业务字段的配置都能直接贴进去处理,不经过服务端
  • 自带示例数据:点一下"示例"就能看到标准格式化效果,不需要自己先造数据

五、常见问题

Q:JSON 支持哪些数据类型?

六种:字符串(双引号包裹)、数字(整数或浮点数)、布尔值(true / false)、空值(null)、对象(花括号的键值对)、数组(方括号的值列表)。没有 undefined、没有函数、没有日期类型,日期通常约定用字符串表示(如 ISO 8601)。

Q:缩进用 2 空格还是 4 空格,可以用 Tab 吗?

API 开发中建议统一 2 空格缩进,并尽量避免 Tab。Tab 在不同编辑器下显示宽度不一致,容易在 diff 里产生大量无意义变更。只要全项目保持一致,2 空格和 4 空格本身没有对错。

Q:键名用 camelCase 还是 snake_case?

两种都行,关键是全项目一致。前端主导的接口常见 camelCase,由数据库字段直接映射出来的常见 snake_case。混用会让调用方取值时反复试错,建议在接口层做一次统一转换。

Q:JSON 只能用在 JavaScript 里吗?

不是。JSON 是轻量级的数据交换格式,语法基于 JavaScript 的子集,但本身独立于语言,几乎所有主流语言都有成熟的序列化与反序列化实现。

Q:19 位订单号格式化后变了,是怎么回事?

这不是格式化的问题,而是数字精度问题。JSON 数字按双精度浮点解析,安全整数上限为 2^53-1(9007199254740991),超过这个范围的 int64 订单号尾数会被静默截断。根本解法是让后端把超长 ID 以字符串形式返回。

六、相关工具推荐

  • XML格式化校验:处理 SOAP 报文、框架配置等 XML 时的同类格式化与校验需求
  • YAML格式化校验:容器编排与 CI 配置常用 YAML,缩进敏感,更需要校验后再提交

七、总结

  • JSON 是 JavaScript 对象字面量的严格子集,尾逗号、单引号、注释、undefined 均不合法,这是 JSON.parse 报错的主要来源。
  • 解析报错时先看错误定位信息,比按 position 数字符快得多;定位后结合格式化结果检查层级结构。
  • 数字精度是独立于语法的一类坑,超过 2^53-1 的整型 ID 应以字符串传输,避免静默截断。
  • 格式化用于阅读,压缩用于传输,二者是同一份数据的两种表示,来回切换即可覆盖日常调试与上线需求。
相关推荐
JavaPub-rodert11 小时前
Docker 日志为什么能把磁盘写爆?讲透 json-file、local、journald、日志轮转与 docker logs
docker·eureka·json
鸽鸽程序猿18 小时前
【项目】【在线判题系统】竞赛新增
状态模式
voipmaker20 小时前
选煤厂智能化:UWB 人员定位系统 WebAPI 对接融合通信平台实战
物联网·实时互动·json·音视频·实时音视频·web·视频
const_qiu20 小时前
第 2.5 章 2.5.6:前端登录、Token 无感续签与路由守卫
java·前端·人工智能·状态模式
时间的情敌20 小时前
《WebGIS 前端的成长路线,三维可视化工程师需要掌握什么》
前端·状态模式
小马不起床1 天前
Django 后端实战指南_9:前后端完整联调和问题修复
python·django·状态模式
java资料站1 天前
十四、Spring AI Alibaba · 案例 · 基于 HumanInTheLoop 的内容审核系统
java·spring·状态模式
IT_Octopus1 天前
【零基础入门 LLM 开发 · Day 15】:LangChain 注册工具——告别手写 JSON Schema
java·langchain·json
星 海1 天前
【json】cJSON库解析文件
c语言·json·cjson