V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
airbasic
V2EX  ›  问与答

我是怎么也用 PHP 处理不了这段 jsonp 了

  •  
  •   airbasic · 2015-05-28 20:17:21 +08:00 · 4794 次点击
    这是一个创建于 3497 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个接口会返回一段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的大牛们了,在线等。

    10 条回复    2015-05-28 21:37:19 +08:00
    kslr
        1
    kslr  
       2015-05-28 20:44:12 +08:00 via Android
    我用手机试了试。。。 掐掉头尾直接解析就行了,也不用转编码 头尾就是()为限
    kslr
        2
    kslr  
       2015-05-28 20:46:57 +08:00 via Android
    手快了,不用这么复杂解析,前面后面都是固定的,按位删掉就行了,然后JSONdecode
    feiyuanqiu
        3
    feiyuanqiu  
       2015-05-28 20:48:56 +08:00
    $json = '{"error"'.getSubstr($jsonp,'{"error"',');');
    你这里截错了...这个链接返回的是这样的: flightjson({"error":0,"HOST":"atx010179212115.s.et2",...
    所以应该是这样:getSubstr($jsonp, 'flightjson(', ')')

    其实我觉得还是用正则更简单点
    zhujinliang
        4
    zhujinliang  
       2015-05-28 20:54:27 +08:00
    json_decode后是object,不是php数组,读取结果中的子项要用->操作符

    最后几行这样写:

    if ($flightData->error == -1) {
    //把错误信息发短信过去
    echo $flightData->errorMsg;
    exit;
    }

    for ($i=0; $i < count($flightData->data->flight); $i++) {
    echo $flightData->data->flight[$i]->flightNo;
    }
    zhujinliang
        5
    zhujinliang  
       2015-05-28 20:59:01 +08:00
    顺便,最后那个for循环写成foreach不是更好么?

    foreach ($flightData->data->flight as $flight) {
    echo $flight->flightNo;
    }
    airbasic
        6
    airbasic  
    OP
       2015-05-28 21:14:36 +08:00
    @feiyuanqiu 这个结果应该是一样的啊,
    可是我还是没法 json_decode 错误是
    - Malformed UTF-8 characters, possibly incorrectly encoded
    @kslr
    airbasic
        7
    airbasic  
    OP
       2015-05-28 21:18:37 +08:00
    谢谢哦 这我还真没注意,但是在json_decode的时候似乎失败了,错误是: Malformed UTF-8 characters, possibly incorrectly encoded 。这是要转换成utf8吗?怎么转换呢?
    @zhujinliang
    airbasic
        8
    airbasic  
    OP
       2015-05-28 21:20:20 +08:00
    @feiyuanqiu
    因为返回的是


    flightjson(

    {"error":0,"HOST":"atx010179212116.s.et2","processTime":"2015-05-28

    这样 中间有个莫名其妙的换行和空格什么的 为了省力我就直接从 error开始截起然后补回去。
    然而并不能 json_decode 难道是中文的原因?
    airbasic
        9
    airbasic  
    OP
       2015-05-28 21:31:30 +08:00
    解决了,
    $json = getSubstr($jsonp,'flightjson(',');');
    //这样转化成json再解析好了
    $json = trim($json);
    $json = iconv("GB2312","UTF-8",$json);
    把编码转换成utf-8就好了
    谢谢各位 我太菜了
    feiyuanqiu
        10
    feiyuanqiu  
       2015-05-28 21:37:19 +08:00
    @airbasic 实际上编码是 GB18030

    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5296 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:21 · PVG 09:21 · LAX 17:21 · JFK 20:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.