我一直在使用PHP来调用API并在JSON中检索一组数据。我需要一次进行20次批量调用。因此,速度非常重要。
但是,我只需要第一个元素,实际上,我只需要一个恰好位于JSON文件开头的数据,索引为0.但是,JSON文件返回大约300组数据。我必须等到所有数据都准备好才能继续。
我想通过消除冗余数据集来加速我的API调用。我是否可以只接收第一组数据,而不必等到所有内容都准备就绪,然后转发索引第一个元素?
请原谅我的英文...提前谢谢你。
答案 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)
没有。在解析并将所需数据发送回客户端计算机之前,您需要获取整个集合。