PHP json_decode处理无效JSON返回NULL问题及解决方案
解决json_decode返回NULL(实际为PHP序列化数据)的问题
嘿,这个问题我太熟了!你肯定是把PHP序列化数据当成JSON来解析了,这就难怪json_decode()会返回NULL啦~
问题根源
你提供的这段数据开头是a:14:{...},这是PHP序列化后的数组格式:
a代表这是一个数组(array)14是数组包含的元素数量- 后面的
s:9:"rating_id"表示字符串类型(string)、长度为9的键名rating_id,对应的值也是字符串类型
而json_decode()只能解析JSON格式的字符串,完全识别不了PHP序列化的结构,所以自然返回NULL。
解决方案
1. 用正确的函数解析
PHP专门提供了unserialize()函数来处理这种序列化数据,直接用它就能得到原始的PHP数组:
// 你的序列化数据(注意要确保数据完整,你提供的末尾是截断的,完整数据才能正常解析) $serializedStr = 'a:14:{s:9:"rating_id";s:24:"rwp_rating_5aafe3e80b03d";s:14:"rating_post_id";i:3293;s:16:"rating_review_id";s:32:"14855d71ef49debd6f9493c13b1bf84b";s:12:"rating_score";a:1:{i:0;d:5;}s:14:"rating_user_id";i:2;s:16:"rating_user_name";s:0:"";s:17:"rating_user_email";s:0:"";s:12:"rating_title";s:0:"";s:14:"rating_comment";s:11:"dsfusof9832";s:13:"rating_images";a:0:{}s:11:"rating_date";i:1521476584;s:...'; // 解析序列化数据 $parsedArray = unserialize($serializedStr); // 检查解析结果 if ($parsedArray !== false) { print_r($parsedArray); // 直接输出解析后的数组结构 } else { echo "哎呀,数据可能被截断或者格式有问题,解析失败了!"; }
2. (可选)转成JSON格式
如果你的最终需求是得到JSON数据,那可以在解析后再用json_encode()转换:
$jsonData = json_encode($parsedArray); echo $jsonData; // 输出标准JSON格式的字符串
重要提醒
- 数据完整性:你提供的末尾是
s:...,这明显是截断的序列化数据,完整的序列化字符串才能被unserialize()正确解析,所以要先确保数据源是完整的哦。 - 安全风险:如果这段数据来自不可信的外部来源(比如用户提交、第三方接口),直接使用
unserialize()存在安全隐患——恶意构造的序列化数据可能会执行恶意代码。这种情况下建议优先使用JSON格式传输数据,或者自己实现更安全的解析逻辑。
内容的提问来源于stack exchange,提问作者osakagreg
相关产品推荐
相关产品推荐

