【背景】
折腾:
【已解决】PHP中如何判断JSON对象或JSON数组中包含某个key键值
期间,json_decode好像出了问题,不工作,导致后续内容无输出,感觉像是缺少了json的库,感觉需要去安装json的PECL库。
【折腾过程】
1.注意到了官网:
中的PHP的版本要求:
(PHP 5 >= 5.2.0, PECL json >= 1.2.0, PHP 7)
自己此处是PHP 5.4,符合要求的。
不对,好像“PECL json >= 1.2.0”表示需要额外安装这个JSON库PECL的???
2.不过还是先去搜:
php json not working
参考:
json – PHP json_decode not working – displays NULL output – Stack Overflow
json – PHP json_decode Not Working – Stack Overflow
先去加上true参数试试:
echo "before json_decode tue"; $decodedJsonArr = json_decode($respJson, true); echo "decodedJsonArr=".$decodedJsonArr; var_dump($decodedJsonArr); echo "var_dump decodedJsonArr done"; // var_dump(isset("access_token", $decodedJsonArr)); var_dump(isset('access_token', $decodedJsonArr)); // var_dump(array_key_exists("access_token", $decodedJsonArr)); var_dump(array_key_exists('access_token', $decodedJsonArr));
结果:
还是没有任何输出。
3.由于要处理的内容不包含斜杠和反斜杠,所以也无需那个所谓的stripslashes
不包含html的entity,所以也不需要html_entity_decode
搜:
php json json_decode no output
参考:
json – PHP json_decode does not work – Stack Overflow
去试试:
的:
结果:
PHP: json_last_error_msg – Manual
“(PHP 5 >= 5.5.0, PHP 7)”
此处PHP是5.4,不符合要求。
“(PHP 5 >= 5.3.0, PHP 7)”
此处PHP5.4,符号这个要求。
去试试:
echo "before decodedJsonObj"; $decodedJsonObj = json_decode($respJson); switch (json_last_error()) { case JSON_ERROR_NONE: echo ' - No errors'; break; case JSON_ERROR_DEPTH: echo ' - Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: echo ' - Syntax error, malformed JSON'; break; case JSON_ERROR_UTF8: echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: echo ' - Unknown error'; break; } echo "decodedJsonObj=".$decodedJsonObj;
结果是:
还是没有任何输出。
4.突然想到,不会是:
对于此处要解码的变量:
$respJson
以为是字符串,结果实际上是:
curl_exec
返回的结果,估计不是字符串,所以去看看:
Return Values
Returns TRUE on success or FALSE on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, FALSE on failure.
所以不确定返回类型。
所以去:
5.确定当前变量$respJson的确是string类型。
那就是json_decode的问题了。
怀疑就是少了PHP的JSON库了。
搜:
php json_decode PECL json
参考:
结果说了,PHP 5.2.0,JSON库是集成到PHP里面了。
不过评论里面说了Ubuntu中说是必须去安装:php5-json
所以猜测此处我的CentOS 7中也是需要去安装的。
6.先去看看:
root@chantyou:access_token# php -m PHP Deprecated: Comments starting with '#' are deprecated in /etc/php.ini on line 461 in Unknown on line 0 [PHP Modules] bz2 calendar Core ctype curl date dom ereg exif fileinfo filter ftp gd gettext gmp hash iconv json libxml mcrypt mhash mysql mysqli openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar readline Reflection session shmop SimpleXML sockets SPL sqlite3 standard tokenizer wddx xml xmlreader xmlwriter xsl zip zlib [Zend Modules] root@chantyou:access_token#
此处看到已经安装了json模块了。
7.再去看看phpinfo()中是否有json:
然后确认也是有的:
8.根据评论,还是去看看配置文件中,是否有关闭了json。
结果/etc/php.ini中更本没有json的配置选项。
9.再去试试:
echo "before decodedJsonArr"; // $decodedJsonObj = json_decode($respJson); $decodedJsonArr = json_decode($respJson, true); echo "after decodedJsonArr"; switch (json_last_error()) { case JSON_ERROR_NONE: echo ' - No errors'; break; case JSON_ERROR_DEPTH: echo ' - Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: echo ' - Syntax error, malformed JSON'; break; case JSON_ERROR_UTF8: echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: echo ' - Unknown error'; break; }
结果:
string1before decodedJsonArrafter decodedJsonArr - No errors
10.再去不加上true再试试:
echo "before decodedJsonArr"; $decodedJsonObj = json_decode($respJson); // $decodedJsonArr = json_decode($respJson, true); echo "after decodedJsonArr"; switch (json_last_error()) { case JSON_ERROR_NONE: echo ' - No errors'; break; case JSON_ERROR_DEPTH: echo ' - Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: echo ' - Syntax error, malformed JSON'; break; case JSON_ERROR_UTF8: echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: echo ' - Unknown error'; break; }
结果:
string1before decodedJsonArrafter decodedJsonArr - No errors
这下真是奇了怪了:
现在去测试,不论是:
$decodedJsonObj = json_decode($respJson);
还是:
$decodedJsonArr = json_decode($respJson, true);
都没问题了。
但是之前测试同样的代码,却没有任何输出。。。
这是诡异了。。。。
11.不管了,继续测试。
echo "before decodedJsonArr"; $decodedJsonObj = json_decode($respJson); // $decodedJsonArr = json_decode($respJson, true); echo "after decodedJsonArr"; switch (json_last_error()) { case JSON_ERROR_NONE: echo ' - No errors'; break; case JSON_ERROR_DEPTH: echo ' - Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: echo ' - Syntax error, malformed JSON'; break; case JSON_ERROR_UTF8: echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: echo ' - Unknown error'; break; } echo "decodedJsonObj=".$decodedJsonObj; var_dump($decodedJsonObj);
结果是:
后续的echo和var_dump就没有任何输出了。。。
12.改为:
// echo "decodedJsonObj=".$decodedJsonObj; echo $decodedJsonObj;
试试:
效果同上。
13.难道是echo变量有问题?
搜:
php echo object no output
无结果。
搜:
php echo object
参考:
再去试试:
// echo "decodedJsonObj=".$decodedJsonObj; // echo $decodedJsonObj; var_dump($decodedJsonObj);
终于可以输出了:
string1before decodedJsonArrafter decodedJsonArr - No errorsobject(stdClass)#2 (2) { ["access_token"]=> string(107) "cUuuS0AY-DiYJ20N0wYuyytZPEOpH21GOkBKDGZEQAfV_sYJSVTT_OLZyiwwkL_i5zEUtKQgQN3bCM8OujuOTb0XWfiJ0rCcBOJ3Nz4nUsw" ["expires_in"]=> int(7200) }
好像证明:
echo 不能直接输出object对象???
【总结】
此处json的json_decode工作不正常:
1.最开始是由于其他的后面的错误代码而导致前面的代码(含json_decode)工作不正常,无法输出显示。
2.后来是改为正确的代码的时候,结果也是不工作。后来不知道为何就又正常工作了。很是诡异。
正常的时候:
(1)PHP内置了json模块,此处无需额外安装json模块
(2)通过php -m或phpinfo()都可以确认此处是包含json模块的。
3.此处用echo打印一个对象:
echo $decodedJsonObj;
结果会导致程序代码异常->后续其他正常代码也不会继续执行了。
前面的正常代码也没有任何输出了。。。
不清楚具体为何。。。
4.正常的json_decode用法:
$decodedJsonObj = json_decode($respJson); var_dump($decodedJsonObj); $decodedJsonArr = json_decode($respJson, true); var_dump($decodedJsonArr);
是可以正常工作的。
此处的输出是:
object(stdClass)#2 (2) { ["access_token"]=> string(107) "c3NjgviUMlscg1AiFZ0DDYu_8muqJHXE4E-Ez9nKqpfql6j25_UceYR7uGY7egCxKAEvMWY179aWElU19DaPQ3ojyQkXKQX4idC0PeJ1liE" ["expires_in"]=> int(7200) } array(2) { ["access_token"]=> string(107) "c3NjgviUMlscg1AiFZ0DDYu_8muqJHXE4E-Ez9nKqpfql6j25_UceYR7uGY7egCxKAEvMWY179aWElU19DaPQ3ojyQkXKQX4idC0PeJ1liE" ["expires_in"]=> int(7200) }
可以注意到,json_decode输出的结果,不加true是object,加了ture是array。