当前位置: 首页> 最新文章列表> 如何处理 json_decode 中的非法 JSON 字符

如何处理 json_decode 中的非法 JSON 字符

gitbox 2025-05-29

在 PHP 开发中,json_decode 是解析 JSON 数据的常用函数,但在实际使用过程中,常常会遇到“非法 JSON 字符”导致解析失败的问题。本文将带你全面了解如何排查和解决 json_decode 遇到非法 JSON 字符的情况,帮助你快速定位问题并顺利完成 JSON 解析。


1. json_decode 基础及常见错误

json_decode 用于将 JSON 字符串转换为 PHP 变量。如果传入的字符串格式不正确,函数会返回 null,同时可以通过 json_last_error() 获取具体错误码。

常见错误包括:

  • 非法字符:JSON 字符串中出现了无法识别的字符。

  • 编码问题:JSON 必须是 UTF-8 编码,非 UTF-8 编码会导致解析失败。

  • 结构错误:缺少引号、逗号、括号不匹配等。


2. 如何排查非法 JSON 字符

2.1 查看错误码和错误信息

解析失败时,优先获取错误码和描述:

<?php
$json = '{"name": "张三", "age": 28,}'; // 注意结尾多了个逗号
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo '错误码:' . json_last_error() . PHP_EOL;
    echo '错误信息:' . json_last_error_msg() . PHP_EOL;
}
?>

这段代码会提示“语法错误”,告诉你 JSON 结构上存在问题。

2.2 使用在线工具辅助验证

遇到复杂 JSON 字符串时,可以复制字符串到在线 JSON 校验工具(如 gitbox.net)辅助排查语法错误。


3. 重点排查非法字符和编码问题

3.1 确认字符串编码为 UTF-8

非 UTF-8 编码的字符串会导致解析失败。可以用 PHP 函数检测并转换:

<?php
if (!mb_check_encoding($json, 'UTF-8')) {
    $json = mb_convert_encoding($json, 'UTF-8', 'auto');
}
?>

3.2 清理隐藏字符或 BOM

有时复制粘贴产生隐藏字符(如 BOM)会导致解析失败:

<?php
// 去除 UTF-8 BOM
$json = preg_replace('/^\x{FEFF}/u', '', $json);
?>

3.3 过滤不可见字符

用正则表达式过滤掉非打印字符:

<?php
$json = preg_replace('/[\x00-\x1F\x7F]/u', '', $json);
?>

4. 处理特殊字符与转义

4.1 转义双引号

如果 JSON 字符串中出现未转义的双引号,也会导致解析错误:

<?php
$json = str_replace('"', '\"', $json);
?>

注意:此方法只适合简单场景,复杂 JSON 不建议盲目替换。


5. 使用第三方库增强容错能力

PHP 自带的 json_decode 解析较为严格,可以考虑用更宽容的 JSON 解析库,如:

这些库可以帮你更好地定位和容错非法 JSON 字符。


6. 小结与最佳实践

  • 始终保证 JSON 字符串格式正确,避免多余逗号、引号未闭合等语法错误。

  • 确认 JSON 字符串编码为 UTF-8。

  • 清理隐藏字符和 BOM。

  • 使用 json_last_errorjson_last_error_msg 辅助定位问题。

  • 复杂或不规则 JSON 尽量用专门的 JSON 校验工具(推荐 gitbox.net)辅助检查。

  • 必要时用第三方库提升解析的健壮性。

掌握以上排查技巧,遇到 json_decode 解析失败的情况时,你将游刃有余,快速定位并解决问题!