一个接口会返回一段jsonp数据,由于要用PHP处理它,我想先把它去掉首尾,改造成一段json,然后再用json_decode() 来解析它
然而我发现无论如何我也无法解析这段处理后出来的json
我的php代码是这样的:
<?php
function getSubstr($str, $leftStr, $rightStr){
$left = strpos($str, $leftStr);
$right = strpos($str, $rightStr,$left);
if($left < 0 or $right < $left) return '';
return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
}
//这是单次执行结果
$jsonp = file_get_contents("http://bestflight.top/getflight.php?from=HGH&to=NNG&date=2015-05-29");
$json = '{"error"'.getSubstr($jsonp,'{"error"',');');
//这样转化成json再解析好了
$json = trim($json);
$json = iconv('gbk', 'utf8', $json);
$flightData = json_decode($json);
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;
}
print_r($flightData);
if ($flightData["error"] == -1) {
//把错误信息发短信过去
echo $flightData["errorMsg"];
exit;
}
for ($i=0; $i < sizeof($flightData["data"]["flight"]); $i++) {
echo $flightData["data"]["flight"][$i]["flightNo"];
}
?>
明明是 no error, 却还是无法解析json,这究竟是什么原因呢?我和小伙伴们讨论了很久,但是都不明白。想问问v2ex的大牛们了,在线等。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.