【已解决】PHP中的json的json_decode不工作没有任何输出

【背景】

折腾:

【已解决】PHP中如何判断JSON对象或JSON数组中包含某个key键值

期间,json_decode好像出了问题,不工作,导致后续内容无输出,感觉像是缺少了json的库,感觉需要去安装json的PECL库。

 

【折腾过程】
1.注意到了官网:

PHP: json_decode – Manual

中的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 函数 – Manual

的:

json_last_error_msg

json_last_error

结果:

PHP: json_last_error_msg – Manual

“(PHP 5 >= 5.5.0, PHP 7)”

此处PHP是5.4,不符合要求。

PHP: json_last_error – Manual

“(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

返回的结果,估计不是字符串,所以去看看:

PHP: curl_exec – Manual

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.

所以不确定返回类型。

所以去:

【已解决】PHP如何查看当前变量的类型

5.确定当前变量$respJson的确是string类型。

那就是json_decode的问题了。

怀疑就是少了PHP的JSON库了。

搜:

php json_decode PECL json

参考:

PHP: Installation – Manual

结果说了,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:

然后确认也是有的:

phpinfo also makesure has json module

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

参考:

PHP: get_object_vars – Manual

再去试试:

// 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。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量