为了账号安全,请及时绑定邮箱和手机立即绑定

关于以下PHP代码中 json_decode(); 为什么没有输出的问题!

关于以下PHP代码中 json_decode(); 为什么没有输出的问题!

守着一只汪 2022-03-03 15:07:37
<?php$ipadd = $_SERVER["REMOTE_ADDR"];//根据百度api接口获取$BaiDuAk = "RYGhi4GcnGLneOiX7M3fm6NV";$address_tmp = file_get_contents('http://api.map.baidu.com/location/ip?ak='.$BaiDuAk.'&ip='.$ipadd .'&coor=bd09ll');//echo $address_tmp;echo json_decode($address_tmp,true);?>主要目的 是根据IP获取地理位置 如果问题解决?
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

我们知道网络api并不是百分百可靠,当遇到网络不稳定,接口出错等各种因素,并不一定返回标准的json数据,例如:


//如果从网络api抓取失败,返回的response为错误信息$response 'request timeout';//json_decode之后返回NULL,你打印之后仍然没有输出,所以你采纳的那个答案仍然也帮不到你print_r(json_decode($response, true));//使用var_dump打印虽然可以看到NULL值,可是这并没有任何用处var_dump(json_decode($response, true));

系统函数json_decode()在解析非json字符串返回NULL,解析乱码的json也返回NULL,你压根都不知道到底是哪里出了问题,因为NULL该返回值是不能通过print_r打印出来的,而官方php手册给了一些捕获异常信息的方法已经封装在下面的函数中了:


<?php/** * json解析接口,优化json_decode对数组的解析 * @param   string      $json_code json字符串 * @return  mix         错误信息或者数组 */function _json_decode($json_code){    $json_arr = json_decode($json_code ,true);    switch (json_last_error()){        case JSON_ERROR_NONE:            $error '';        break;        case JSON_ERROR_DEPTH:            $error ' - Maximum stack depth exceeded';        break;        case JSON_ERROR_STATE_MISMATCH:            $error ' - Underflow or the modes mismatch';        break;        case JSON_ERROR_CTRL_CHAR:            $error ' - Unexpected control character found';        break;        case JSON_ERROR_SYNTAX:            $error ' - Syntax error, malformed JSON';        break;        case JSON_ERROR_UTF8:            $error ' - Malformed UTF-8 characters, possibly incorrectly encoded';        break;        default:            $error ' - Unknown error';        break;    }    if($error)    {        return $error.':'.$json_code;    }else{        return $json_arr;    }}header('Content-type:text/html;charset=utf-8');$json 'this is not a json code';$arr = _json_decode($json);if(is_array($arr)){    //解析正确,逻辑代码部分    print_r($arr);}else{    //请求超时, 一般都会有异常处理机制, 例如重新发起请求    if($result == 'request timeout') {        //发起请求    }else{        //如果没有异常处理机制,抛出异常给上一层处理        throw new Exception($result);    }}

使用_json_decode的返回值如果是字符串,说明在解析json数据时遇到了错误,只要添加适当处理机制,可以大大提高代码的稳固性。

如果返回值是数组,这时便可以使用print_r打印出来。



查看完整回答
反对 回复 2022-03-07
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

用这个打出来看看print_r (json_decode($address_tmp,true));

查看完整回答
反对 回复 2022-03-07
  • 2 回答
  • 0 关注
  • 319 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信