是否可以使用PHP从API调用中仅接收部分JSON结果?

时间:2013-03-04 20:41:48

标签: php javascript ajax json

我一直在使用PHP来调用API并在JSON中检索一组数据。我需要一次进行20次批量调用。因此,速度非常重要。

但是,我只需要第一个元素,实际上,我只需要一个恰好位于JSON文件开头的数据,索引为0.但是,JSON文件返回大约300组数据。我必须等到所有数据都准备好才能继续。

我想通过消除冗余数据集来加速我的API调用。我是否可以只接收第一组数据,而不必等到所有内容都准备就绪,然后转发索引第一个元素?

请原谅我的英文...提前谢谢你。

3 个答案:

答案 0 :(得分:1)

没有。 json不是" streamable"格式。直到收到整个字符串,它才能被解码为原生结构。如果你知道你需要什么,那么你可以使用字符串操作来检索你需要的部分,但这不可靠也不可取。类似地,php不会在文本编码时流出文本。

e.g。考虑一种情况,您的数据结构是LOOOONG浅阵列

$x = array(
    0 => blah
    1 => blah
    ...
    999,999,998 => blah
    999,999,999 => array( .... even more nested data here ...)
);

流媒体格式会将其作为

运行
['blah', 'blah' ............

你可以假设除了那些' blah'之外什么都没有。在顶层并输出],以生成完整的json字符串:

['blah'....   , 'blah']

然后发送,然后你继续编码并到达那个子阵列......现在你突然得到了

['blah' ....., 'blah'][ ...sub array here ....]

现在它不再是有效的JSON。

所以基本上,json编码是在一个(长)镜头中完成的,而不是在dibs和drabs中完成,只是因为你根本无法知道后来会发生什么"后来"没有先解析整个结构。

答案 1 :(得分:1)

你可以使用fopen来获取保证拥有你需要的字节的字节,然后使用正则表达式来解析它。类似的东西:

$max_bytes = 512;
$fp = fopen($url, "r") ;

$data = "" ;
if($fp) {

    while(!preg_match('/"totalAmount"\:"(.*)"/U', $data, $match)) 
        $data .= stream_get_contents($fp, $max_bytes) ;

    fclose($fp);

    if(count($match)){
        $totalAmount = $match[1];
    }
}

请记住,您无法将$ data中存储的字符串用作有效的json。它只是部分

答案 2 :(得分:0)

没有。在解析并将所需数据发送回客户端计算机之前,您需要获取整个集合。