PHP json_encode、json_decode常见问题
1.json_decode返回null
先在json_decode() 后面 打印json_last_error()
查看错误0 = JSON_ERROR_NONE //没有错误发生
1 = JSON_ERROR_DEPTH //到达了最大堆栈深度
2 = JSON_ERROR_STATE_MISMATCH //无效或异常的json
3 = JSON_ERROR_CTRL_CHAR //控制字符错误,可能是编码不对
4 = JSON_ERROR_SYNTAX //语法错误
5 = JSON_ERROR_UTF8 //异常的utf-8字符,也许是因为不正确的编码
一般常见出现 错误4 ,使用时需要注意:
- 使用UTF-8编码
- 不能在最后元素有逗号
- 不能使用单引号'
- 最好不要使用 \r \n (换行符)
- 字符串里面不出现奇怪的符号, 比如输入法的全角空格 或是 非中英文空格
如果非要保留特殊字符,则要做好兼容,比如
/**
* @param $str string json_encode()后的字符串
*/
public static function parseJsonStr($str)
{
$rule = array("\r\n", "\n", "\r");
$str = str_replace($rule,'',$str); // 保留换行
$str = str_replace('\'',"\'",$str); // 处理单引号
$res = json_decode($str, 1);
if (!empty($res)){
foreach ($res as &$v){
$v = str_replace("\'", "'", $v); // 还原单引号
}
return $res;
}
}
2.json_encode保留中文的方法
1. 几乎所有版本可以用,而且能解决中文乱码的问题
public function mainLogic()
{
$arr = [
'a' => '测试1',
'b' => '测试2',
];
// json序列化
foreach ($arr as &$v){
$v = urlencode($v);
}
$json_str = urldecode( json_encode($arr) );
var_dump($json_str);
// json反序列化
$t = json_decode($json_str,1);
var_dump($t);
}
2. php>=5.4版本,该方法较快
public function mainLogic()
{
$arr = [
'a' => '测试1',
'b' => '测试2',
];
// json序列化
$json_str = json_encode($arr,JSON_UNESCAPED_UNICODE);
var_dump($json_str);
// json反序列化
$t = json_decode($json_str,1);
var_dump($t);
}
结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!