PHP自5.2版本开始,原生提供了JSON的封包和解包的函数,PHP的JSON操作对JSON的格式要求比较严格。
参考一文得知:
json_decode要求的字符串比较严格:
(1)使用UTF-8编码
(2)不能在最后元素有逗号
(3)不能使用单引号
(4)不能有r,t,如果有请替换
因此,返回NULL的情况还不少,这个得靠大家写代码的时候多多细心。本文要讲的是我从POST获取的JSON格式的字符串,我确保字符串打印出来,看起来没有任何错误,但是json_decode就是返回NULL。这个奇葩的问题,在网上找了很久,有些网友说是字符集的问题,我测试确认后不是,那到底是什么问题呢?
首先,我发送一个webservice请求:
post操作封装函数:
<span>function do_post_request($url, $data, $optional_headers = null) { $params = array('http' => array( 'method' => 'POST', 'content' => $data )); if ($optional_headers !== null) { $params['http']['header'] = $optional_headers; } $ctx = stream_context_create($params); $fp = @fopen($url, 'rb', false, $ctx); if (!$fp) { throw new Exception("Problem with $url, $php_errormsg"); } $response = @stream_get_contents($fp); if ($response === false) { throw new Exception("Problem reading data from $url, $php_errormsg"); } return $response; }</span>(1)发起POST请求: <span><span>$url = '*******/index.php/Home/Interface/createUser'; $data = '{ "subsysid":"ASDF", "userid":"yangwulang", "pwd":"96e79218965eb72c92a549dd5a330112", "email":"[email protected]", "nickname":"杨五郎" }';</span></span>
(2)接着,获取POST返回的数据:
<span>$userReg = do_post_request($url, $data); echo $userReg."<br>";</span>(3)打印从POST获取的数据$userReg:
{"resultcode":"6","resultdesc":"the userid already exists"}
(4)调用json_decode()函数解析该JSON字符串:
$regRes = json_decode($userReg);
var_dump($regRes);
var_dump会打印出来其参数的数据类型和值,打印出来的值是NULL
从上面打印出来$userReg的JSON字符串来看,没有任何问题啊,为啥json_decode()解析不了呢?
(1)首先,想到的是,查看到底是什么原因导致的返回值是NULL。PHP提供了json_last_error()和json_last_error_msg()两个函数返回json_decode()函数解析JSON字符串失败的错误代号和错误信息。打印这两个错误信息,获取到:
json_last_error(),打印值为”4“;json_last_error_msg()打印值为”syntax error“。
意思是,错误代号为4,错误信息为”语法错误“。
(2)语法错误,说明肯定JSON字符串中某个部分写错了,怀疑是该JSON字符串格式不对,然后将上面(3)中打印出来的JSON字符串{"resultcode":"6","resultdesc":"the userid already exists"},作为一个字符串变量,直接进行json_decode(),看看是否可以正确解析。
$userReg = '{"resultcode":"6","resultdesc":"the userid already exists"}';
$regRes = json_decode($userReg);
var_dump($regRes);
解析成功!打印结果:object(stdClass)#1 (2) { ["resultcode"]=> string(1) "6" ["resultdesc"]=> string(25) "the userid already exists" }
(3)把POST传过来的JSON字符串,直接进行json_decode失败,但是将其值作为一个变量来解析就成功,难道是字符集的问题?JSON只支持utf8字符集。但是,我的项目工程和该PHP页面都设置的是utf-8编码啊,应该不是字符集问题,但是为了保险起见,我还是在$userReg = do_post_request($url, $data);后面加了一句话,来验证是否是字符集问题:
echo mb_detect_encoding($userReg, array("ASCII","GB2312","GBK","UTF-8"));
打印结果是UTF-8,说明字符集确实没问题。