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

<?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获取地理位置 如果问题解决?

守着一只汪
浏览 320回答 2
2回答

HUX布斯

我们知道网络api并不是百分百可靠,当遇到网络不稳定,接口出错等各种因素,并不一定返回标准的json数据,例如://如果从网络api抓取失败,返回的response为错误信息$response&nbsp;=&nbsp;'request&nbsp;timeout';//json_decode之后返回NULL,你打印之后仍然没有输出,所以你采纳的那个答案仍然也帮不到你print_r(json_decode($response,&nbsp;true));//使用var_dump打印虽然可以看到NULL值,可是这并没有任何用处var_dump(json_decode($response,&nbsp;true));系统函数json_decode()在解析非json字符串返回NULL,解析乱码的json也返回NULL,你压根都不知道到底是哪里出了问题,因为NULL该返回值是不能通过print_r打印出来的,而官方php手册给了一些捕获异常信息的方法已经封装在下面的函数中了:<?php/**&nbsp;*&nbsp;json解析接口,优化json_decode对数组的解析&nbsp;*&nbsp;@param&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$json_code&nbsp;json字符串&nbsp;*&nbsp;@return&nbsp;&nbsp;mix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;错误信息或者数组&nbsp;*/function&nbsp;_json_decode($json_code){&nbsp;&nbsp;&nbsp;&nbsp;$json_arr&nbsp;=&nbsp;json_decode($json_code&nbsp;,true);&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(json_last_error()){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;JSON_ERROR_NONE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;'';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;JSON_ERROR_DEPTH:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;'&nbsp;-&nbsp;Maximum&nbsp;stack&nbsp;depth&nbsp;exceeded';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;JSON_ERROR_STATE_MISMATCH:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;'&nbsp;-&nbsp;Underflow&nbsp;or&nbsp;the&nbsp;modes&nbsp;mismatch';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;JSON_ERROR_CTRL_CHAR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;'&nbsp;-&nbsp;Unexpected&nbsp;control&nbsp;character&nbsp;found';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;JSON_ERROR_SYNTAX:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;'&nbsp;-&nbsp;Syntax&nbsp;error,&nbsp;malformed&nbsp;JSON';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;JSON_ERROR_UTF8:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;'&nbsp;-&nbsp;Malformed&nbsp;UTF-8&nbsp;characters,&nbsp;possibly&nbsp;incorrectly&nbsp;encoded';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error&nbsp;=&nbsp;'&nbsp;-&nbsp;Unknown&nbsp;error';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;if($error)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$error.':'.$json_code;&nbsp;&nbsp;&nbsp;&nbsp;}else{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$json_arr;&nbsp;&nbsp;&nbsp;&nbsp;}}header('Content-type:text/html;charset=utf-8');$json&nbsp;=&nbsp;'this&nbsp;is&nbsp;not&nbsp;a&nbsp;json&nbsp;code';$arr&nbsp;=&nbsp;_json_decode($json);if(is_array($arr)){&nbsp;&nbsp;&nbsp;&nbsp;//解析正确,逻辑代码部分&nbsp;&nbsp;&nbsp;&nbsp;print_r($arr);}else{&nbsp;&nbsp;&nbsp;&nbsp;//请求超时,&nbsp;一般都会有异常处理机制,&nbsp;例如重新发起请求&nbsp;&nbsp;&nbsp;&nbsp;if($result&nbsp;==&nbsp;'request&nbsp;timeout')&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发起请求&nbsp;&nbsp;&nbsp;&nbsp;}else{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果没有异常处理机制,抛出异常给上一层处理&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception($result);&nbsp;&nbsp;&nbsp;&nbsp;}}使用_json_decode的返回值如果是字符串,说明在解析json数据时遇到了错误,只要添加适当处理机制,可以大大提高代码的稳固性。如果返回值是数组,这时便可以使用print_r打印出来。

有只小跳蛙

用这个打出来看看print_r (json_decode($address_tmp,true));
打开App,查看更多内容
随时随地看视频慕课网APP