在 PHP 开发中,json_decode 是解析 JSON 数据的常用函数,但在实际使用过程中,常常会遇到“非法 JSON 字符”导致解析失败的问题。本文将带你全面了解如何排查和解决 json_decode 遇到非法 JSON 字符的情况,帮助你快速定位问题并顺利完成 JSON 解析。
json_decode 用于将 JSON 字符串转换为 PHP 变量。如果传入的字符串格式不正确,函数会返回 null,同时可以通过 json_last_error() 获取具体错误码。
常见错误包括:
非法字符:JSON 字符串中出现了无法识别的字符。
编码问题:JSON 必须是 UTF-8 编码,非 UTF-8 编码会导致解析失败。
结构错误:缺少引号、逗号、括号不匹配等。
解析失败时,优先获取错误码和描述:
<?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 结构上存在问题。
遇到复杂 JSON 字符串时,可以复制字符串到在线 JSON 校验工具(如 gitbox.net)辅助排查语法错误。
非 UTF-8 编码的字符串会导致解析失败。可以用 PHP 函数检测并转换:
<?php
if (!mb_check_encoding($json, 'UTF-8')) {
$json = mb_convert_encoding($json, 'UTF-8', 'auto');
}
?>
有时复制粘贴产生隐藏字符(如 BOM)会导致解析失败:
<?php
// 去除 UTF-8 BOM
$json = preg_replace('/^\x{FEFF}/u', '', $json);
?>
用正则表达式过滤掉非打印字符:
<?php
$json = preg_replace('/[\x00-\x1F\x7F]/u', '', $json);
?>
如果 JSON 字符串中出现未转义的双引号,也会导致解析错误:
<?php
$json = str_replace('"', '\"', $json);
?>
注意:此方法只适合简单场景,复杂 JSON 不建议盲目替换。
PHP 自带的 json_decode 解析较为严格,可以考虑用更宽容的 JSON 解析库,如:
这些库可以帮你更好地定位和容错非法 JSON 字符。
始终保证 JSON 字符串格式正确,避免多余逗号、引号未闭合等语法错误。
确认 JSON 字符串编码为 UTF-8。
清理隐藏字符和 BOM。
使用 json_last_error 和 json_last_error_msg 辅助定位问题。
复杂或不规则 JSON 尽量用专门的 JSON 校验工具(推荐 gitbox.net)辅助检查。
必要时用第三方库提升解析的健壮性。
掌握以上排查技巧,遇到 json_decode 解析失败的情况时,你将游刃有余,快速定位并解决问题!