【背景】
折腾:
【已解决】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参数试试:
1 2 3 4 5 6 7 8 9 | 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,符号这个要求。
去试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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.先去看看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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.再去试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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 ; } |
结果:
1 | string1before decodedJsonArrafter decodedJsonArr - No errors |
10.再去不加上true再试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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.不管了,继续测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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.改为:
1 2 | // echo "decodedJsonObj=".$decodedJsonObj; echo $decodedJsonObj ; |
试试:
效果同上。
13.难道是echo变量有问题?
搜:
php echo object no output
无结果。
搜:
php echo object
参考:
再去试试:
1 2 3 | // echo "decodedJsonObj=".$decodedJsonObj; // echo $decodedJsonObj; var_dump( $decodedJsonObj ); |
终于可以输出了:
1 2 3 4 5 6 | 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打印一个对象:
1 | echo $decodedJsonObj ; |
结果会导致程序代码异常->后续其他正常代码也不会继续执行了。
前面的正常代码也没有任何输出了。。。
不清楚具体为何。。。
4.正常的json_decode用法:
1 2 3 4 5 | $decodedJsonObj = json_decode( $respJson ); var_dump( $decodedJsonObj ); $decodedJsonArr = json_decode( $respJson , true); var_dump( $decodedJsonArr ); |
是可以正常工作的。
此处的输出是:
1 2 3 4 5 6 7 8 9 10 11 12 | 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。