JSON

PHP POST获取的JSON使用json_decode返回NULL

字号+ 作者:H5之家 来源:H5之家 2016-12-13 12:03 我要评论( )

PHP自5.2版本开始,原生提供了JSON的封包和解包的函数,PHP的JSON操作对JSON的格式要求比较严格。 参考http://www.phpddt.com/php/json_decodebom.html一文得知

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,说明字符集确实没问题。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • PHP浅析JSON使用技巧

    PHP浅析JSON使用技巧

    2016-12-12 11:00

  • JSP读取POST传来的JSON数据

    JSP读取POST传来的JSON数据

    2016-12-12 10:00

  • json 设计规则

    json 设计规则

    2016-12-11 18:02

  • jQuery.parseJSON vs JSON.parse

    jQuery.parseJSON vs JSON.parse

    2016-12-11 16:00

网友点评
e