【背景】
折腾:
期间,需要去判断已经解码出来的json对象或json数组中是否包含键值access_token
【折腾过程】
1.搜:
php json contain key
参考:
php – how to know whether key exists in Json string – Stack Overflow
json – Correct PHP code to check if a variable exists – Stack Overflow
->
->
搜:
array_key_exists
PHP: array_key_exists – Manual
即:
array_key_exists:只判断数组中是否存在某个键值
isset:不仅判断是否存在某个键值,还判断键的值是否为真
所以对于:
$json ={"user_id":null}
isset( $mydata['user_id'] 结果是False(而不是True)。
->
Json解码后是array的话,此处就用array_key_exists去判断。
2.去试试代码:
$decodedJsonObj = json_decode($respJson);
var_dump($decodedJsonObj);
var_dump(isset("access_token", $decodedJsonObj));
var_dump(array_key_exists("access_token", $decodedJsonObj));
$decodedJsonArr = json_decode($respJson, true);
var_dump($decodedJsonArr);
var_dump(isset("access_token", $decodedJsonArr));
var_dump(array_key_exists("access_token", $decodedJsonArr));的输出是:
空白。没有输出。
3.试试:
$decodedJsonObj = json_decode($respJson);
var_dump($decodedJsonObj);
// var_dump(isset("access_token", $decodedJsonObj));
// var_dump(array_key_exists("access_token", $decodedJsonObj));
$decodedJsonArr = json_decode($respJson, true);
var_dump($decodedJsonArr);
var_dump(isset("access_token", $decodedJsonArr));
var_dump(array_key_exists("access_token", $decodedJsonArr));结果是:
还是没输出。
4.好像key的字符串不能用双引号?换成单引号试试
$decodedJsonObj = json_decode($respJson);
var_dump($decodedJsonObj);
// var_dump(isset("access_token", $decodedJsonObj));
// var_dump(array_key_exists("access_token", $decodedJsonObj));
$decodedJsonArr = json_decode($respJson, true);
var_dump($decodedJsonArr);
// 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));结果:
还是没有输出。
5.去加echo或print:
echo "before decodedJsonObj";
$decodedJsonObj = json_decode($respJson);
echo "decodedJsonObj=".$decodedJsonObj;
var_dump($decodedJsonObj);
echo "var_dump decodedJsonObj done";
// var_dump(isset("access_token", $decodedJsonObj));
// var_dump(array_key_exists("access_token", $decodedJsonObj));
$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));结果:
没有任何输出。
6.再试试:
echo "before decodedJsonObj";
$decodedJsonObj = json_decode($respJson);
echo "decodedJsonObj=".$decodedJsonObj;
// var_dump($decodedJsonObj);
// echo "var_dump decodedJsonObj done";
// // var_dump(isset("access_token", $decodedJsonObj));
// // var_dump(array_key_exists("access_token", $decodedJsonObj));
// $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));结果:
输出了:
before decodedJsonObj
好像是json_decode没有执行啊。。。
所以去研究:
【已解决】PHP中的json的json_decode不工作没有任何输出
7.接着发现是:
echo打印对象,程序异常:
$decodedJsonObj = json_decode($respJson); echo $decodedJsonObj; //code run abnormal, not output anything
代码调用错误,程序异常:
$decodedJsonArr = json_decode($respJson, true);
var_dump(isset('access_token', $decodedJsonArr)); // lead code run abnormal -> not output anythis期间参考:
【总结】
最终是用如下代码:
var_dump($respJson);
$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; //code run abnormal, not output anything
var_dump($decodedJsonObj);
/*
object(stdClass)#2 (2) {
["access_token"]=>
string(107) "hfhKCZBGAWrPkMPL2aT_z1pGBWqZNBhSjbJaW3aLgXnqDg5_BRIYb8ZV3nplUFcDzkcCBwld5T0eeVN2BqlUexkrFauoi31EcT6z3D9QZvM"
["expires_in"]=>
int(7200)
}
*/
// echo "var_dump decodedJsonObj done";
// var_dump(isset("access_token", $decodedJsonObj)); // lead code run abnormal -> not output anythis
var_dump(array_key_exists("access_token", $decodedJsonObj)); //bool(true)
var_dump(array_key_exists("errcode", $decodedJsonObj)); //bool(false)
$decodedJsonArr = json_decode($respJson, true);
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 "decodedJsonArr=".$decodedJsonArr;
var_dump($decodedJsonArr);
/*
array(2) {
["access_token"]=>
string(107) "hfhKCZBGAWrPkMPL2aT_z1pGBWqZNBhSjbJaW3aLgXnqDg5_BRIYb8ZV3nplUFcDzkcCBwld5T0eeVN2BqlUexkrFauoi31EcT6z3D9QZvM"
["expires_in"]=>
int(7200)
}
*/
// var_dump(isset('access_token', $decodedJsonArr)); // lead code run abnormal -> not output anythis
var_dump(array_key_exists('access_token', $decodedJsonArr)); //bool(true)
var_dump(array_key_exists('errcode', $decodedJsonArr)); //bool(false)输出结果是:
"{"access_token":"xhYQ59oZs9xS6ehH7bRJb1Zazx46D6d01PBaA50ZUOVpvlJidykk8iuzAzFAy8Lpmn1uw29PUMXe7UXg9-Lb1k4lcUZIGYnN9e0cWKSUTpc","expires_in":7200}"
- No errorsobject(stdClass)#2 (2) {
["access_token"]=>
string(107) "xhYQ59oZs9xS6ehH7bRJb1Zazx46D6d01PBaA50ZUOVpvlJidykk8iuzAzFAy8Lpmn1uw29PUMXe7UXg9-Lb1k4lcUZIGYnN9e0cWKSUTpc"
["expires_in"]=>
int(7200)
}
bool(true)
bool(false)
- No errorsarray(2) {
["access_token"]=>
string(107) "xhYQ59oZs9xS6ehH7bRJb1Zazx46D6d01PBaA50ZUOVpvlJidykk8iuzAzFAy8Lpmn1uw29PUMXe7UXg9-Lb1k4lcUZIGYnN9e0cWKSUTpc"
["expires_in"]=>
int(7200)
}
bool(true)
bool(false)2.(1)可以用array_key_exists去判断object对象或array数组中是否含有某个键;
(2)不可以用isset去判断判断object对象或array数组中是否含有某个键
->所以这样的代码:
var_dump(isset('access_token', $decodedJsonArr)); // lead code run abnormal -> not output anythis会导致程序异常:
之前的正常的代码输出都没了;
后续正常的代码也不执行,也没输出了。