PHP json_decode(); 为什么没输出

<?php$ipadd=$_SERVER["REMOTE_ADDR"];//根据百度api接口获取$BaiDuAk="RYGhi4GcnGLneOiX7M3fm6NV";... <?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获取地理位置 如果问题解决有加分的哦
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励30(财富值+成长值)
MS中文网
推荐于2018-04-06 · TA获得超过119个赞
知道小有建树答主
回答量:48
采纳率:0%
帮助的人:26.5万
展开全部

我们知道网络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打印出来。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
凉赞被谁占了
2014-10-21 · TA获得超过949个赞
知道小有建树答主
回答量:576
采纳率:100%
帮助的人:314万
展开全部
用这个打出来看看print_r (json_decode($address_tmp,true));
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式