在PHP开发过程中,我们经常需要将字符串转换为JSON格式用于接口返回、数据存储等场景,但实际操作中很容易遇到转换失败、返回null或者抛出错误的情况,下面我们就来梳理常见的错误原因和对应的解决方法。

常见错误场景及原因
1. 字符串编码不是UTF-8
json_encode和json_decode函数默认只支持UTF-8编码的字符串,如果待转换的字符串是GBK、GB2312等其他编码,就会出现转换失败的问题,通常会返回false或者null。
2. 字符串本身不符合JSON格式
如果待转换的字符串不是合法的JSON格式,比如缺少引号、括号不匹配、存在多余的逗号,调用json_decode时就会返回null,同时可以通过json_last_error获取错误码。
3. 字符串包含特殊控制字符
字符串中如果存在换行符、制表符、转义字符等控制字符,在转换时可能会导致JSON格式异常,尤其是从文件或者接口读取的字符串很容易出现这类问题。
4. 字符串包含中文未正确处理
早期PHP版本的json_encode处理中文时默认会转成unicode编码,虽然不算错误,但很多场景下我们需要直接显示中文,处理不当也会被认为是转换异常。
对应解决方法
编码问题处理
如果字符串是其他编码,先通过mb_convert_encoding或者iconv转换为UTF-8编码再转换:
<?php // 假设原始字符串是GBK编码 $str = "这是一段GBK编码的字符串"; // 先转换为UTF-8编码 $utf8Str = mb_convert_encoding($str, "UTF-8", "GBK"); // 再转换为JSON $json = json_encode($utf8Str); var_dump($json); ?>
JSON格式校验
转换前可以先校验字符串是否符合JSON格式,同时转换后通过json_last_error排查错误:
<?php
$str = "{name:"test"}"; // 不符合JSON格式,键名没有加双引号
$data = json_decode($str, true);
if (json_last_error() != JSON_ERROR_NONE) {
echo "JSON转换错误:" . json_last_error_msg();
} else {
var_dump($data);
}
?>特殊字符处理
可以使用正则表达式过滤掉控制字符,或者对特殊字符进行转义:
<?php
$str = "包含换行符的字符串\n还有制表符\t";
// 过滤控制字符
$cleanStr = preg_replace('/[\x00-\x1F\x7F]/', '', $str);
$json = json_encode($cleanStr);
var_dump($json);
?>中文显示处理
使用json_encode时加上JSON_UNESCAPED_UNICODE参数,避免中文被转成unicode:
<?php
$arr = array("name" => "张三", "age" => 20);
// 不转义中文
$json = json_encode($arr, JSON_UNESCAPED_UNICODE);
var_dump($json);
?>快速排查步骤
遇到字符串转JSON报错时,可以按照以下步骤快速定位问题:
- 第一步:检查字符串编码,确保是UTF-8格式
- 第二步:打印字符串内容,确认是否符合JSON格式规范
- 第三步:调用json_last_error和json_last_error_msg获取具体错误信息
- 第四步:检查字符串中是否包含特殊控制字符,进行过滤处理
掌握以上方法后,基本可以解决大部分PHP字符串转JSON的报错问题,日常开发中建议提前做好编码校验和格式处理,减少异常出现的概率。
PHPJSON字符串转JSONjson_decodejson_encode修改时间:2026-06-04 06:31:32