第8天:JSON解析错误处理

先区分三类错误

JSON解析错误是指文本不符合JSON语法,解析器无法生成数据结构。字段类型不符合业务要求属于数据验证问题,读取不存在的属性则属于程序运行时问题;后两类即使在JSON.parse()成功后仍可能发生。

常见的JSON语法错误

单引号或未加双引号的键

{'name': 'JsonTool'}
{name: "JsonTool"}

JSON对象的键和字符串值都必须使用双引号。上面两行都是JavaScript风格的对象写法,不是合法JSON。

缺少逗号或尾随逗号

{"name": "JsonTool" "active": true}
{"items": [1, 2,]}

对象成员和数组元素之间需要逗号,但最后一项之后不能保留尾随逗号。

括号或字符串未闭合

{"items": [1, 2]
{"message": "内容未结束}

对象、数组和字符串都必须成对闭合。解析器有时会在文本末尾才报告这类错误。

非法转义或字符串中的原始换行

{"code": "\x41"}
{"message": "第一行
第二行"}

JSON不支持\x转义,字符串中的换行也必须写成\n。反斜杠本身需要写成\\

如何定位错误位置

  1. 先阅读解析器提供的位置、行号或列号。不同浏览器的错误文案可能不同,不要依赖某一句固定提示。
  2. 同时检查报错位置和它前一个结构字符。真正缺失的逗号或引号经常位于解析器停止位置之前。
  3. 从最内层对象或数组开始核对括号,再检查键名、字符串和逗号。
  4. 若数据很长,先截取能稳定复现错误的最小片段,避免被无关内容干扰。

使用在线工具辅助检查

可以把待检查内容粘贴到JSON在线校验工具。合法数据会显示格式化结果;不合法数据会给出解析错误及行列位置。若使用工具栏中的“修复”功能,应把结果视为候选修改并逐项核对,尤其不要让自动修复改变金额、标识符或字段含义。

在JavaScript中捕获解析错误

const brokenJson = '{"name":"JsonTool","items":[1,2,]}';

try {
  const data = JSON.parse(brokenJson);
  console.log(data);
} catch (error) {
  console.error('JSON解析失败', error.message);
}

try...catch可以避免无效输入直接中断后续流程。生产环境中应记录必要的上下文,但不要把令牌、密码或完整敏感数据写入日志。

解析成功不等于数据可用

{"age":"18"}是合法JSON,但如果业务要求age必须是数字,它仍然是不合格的数据。语法检查之后,还应使用明确的字段规则或JSON Schema验证必填字段、类型、范围和格式。

修复检查清单

  • 键名和字符串是否都使用双引号。
  • 对象成员、数组元素之间是否有逗号,末项后是否误留逗号。
  • 花括号、方括号和双引号是否成对闭合。
  • 反斜杠、换行、制表符和控制字符是否正确转义。
  • 修复后是否重新解析,并继续执行数据结构或JSON Schema验证。

结论

处理JSON解析失败时,先确认它是否属于语法问题,再根据错误位置检查前后字符,并缩小到最小复现片段。解析成功后仍需验证数据结构和业务规则,二者不能相互替代。

明天,我们将了解JSON Schema,这是一种用于描述和验证JSON数据结构的强大工具。这将帮助我们确保数据的完整性和正确性。


以上就是我们第八天课程的全部内容。希望您觉得有帮助,并为接下来的学习做好准备。如果您有任何疑问或需要进一步的解释,请随时联系我们。明天见!

动手练习: JSON 格式化 · JSON 解析 · JSON 校验 · JSON 压缩 · JSON 转 XML