前后端联调,后端说JSON格式不对,前端看了半天没看出毛病。JSON这玩意儿规则简单,但踩坑点不少,一个逗号一个引号就能让整个解析挂掉。把下面这些常见错误理清,排查能快一大截。
【JSON的标准语法是什么?】JSON只有三种结构:对象用花括号、数组用方括号、值可以是字符串数字布尔null或嵌套对象数组。字符串必须用双引号,不能用单引号。键名也必须用双引号。元素之间用逗号分隔。就这么几条,但每条都能踩坑。
【为什么单引号会报错?】JSON标准规定字符串和键名必须用双引号,单引号在JSON里不合法。但JavaScript里单引号双引号都行,所以写惯JS的人常把单引号带进JSON,一解析就挂。这是最常见的错误,没有之一。排查时先全局搜单引号,看是不是混进JSON了。
【尾逗号为什么是错的?】最后一个键值对或数组元素后面不能有逗号,这叫尾逗号。比如{"a":1,"b":2,}最后那个逗号在JS里合法,但在严格JSON里非法,大部分解析器会报错。从其他语言序列化出来的JSON偶尔带尾逗号,复制粘贴时留意删掉。
【注释能写进JSON吗?】不能,标准JSON不支持注释。这是它和JS对象字面量的重要区别。想加注释要么用JSON5这种超集,要么把注释作为字段塞进去。配置文件推荐用支持注释的YAML或TOML,别硬往JSON里塞注释导致解析失败。
【控制字符和转义怎么处理?】字符串里出现双引号、反斜杠、换行这些得转义。双引号写成反斜杠加双引号,反斜杠写成两个反斜杠,换行写成反斜杠加n。忘了转义是仅次于单引号的第二大错误,尤其从数据库或文本框直接取值塞进JSON时。正确的做法是后端用序列化函数而不是字符串拼接,让函数自动处理转义。
【数字和布尔怎么写?】数字直接写不加引号,123就是数字,写成"123"就变成字符串了,类型不同解析出来行为也不同。布尔只有true和false两个值,小写不能加引号。null也是小写不加引号。写成True或None就错了,那是Python的写法,JSON不认。
【遇到解析失败怎么排查?】分三步走。先看报错信息,多数解析器会告诉你出错位置(第几行第几列)。再看那个位置附近,通常是引号逗号括号的问题。最后用在线JSON校验工具格式化一遍,它会标红出错位置。养成用校验工具的习惯,比肉眼排查快得多。本站也有JSON格式化校验工具,直接粘贴就能定位错误。
【BOM头和编码问题会导致解析失败吗?】会,而且很隐蔽。UTF-8文件开头的BOM头(三个不可见字节)会让JSON解析器误判,报意想不到的语法错误。从Windows记事本另存的UTF-8文件常带BOM。解决办法是用编辑器另存为UTF-8无BOM,或者用代码读取时去掉前三个字节。另外用GBK或Latin1存的JSON在UTF-8环境下解析中文会乱码或报错,存文件统一用UTF-8无BOM。这种编码问题排查最费时间,因为报错信息指向语法但根因在编码。
JSON的坑就这些,核心记住四条:双引号别用单引号、不能有尾逗号、不能写注释、特殊字符要转义。写完用工具校验一遍,联调时少扯半天皮。