【背景】
折腾:
期间,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
参考:
先去加上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
参考:
去试试:
的:
结果:
“(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。