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

是否可以仅从使用PHP的API调用接收JSON中的部分结果?,php,javascript,ajax,json,Php,Javascript,Ajax,Json,我一直在使用PHP调用API并检索JSON中的一组数据。我需要一次进行20次批处理调用。因此,速度是非常重要的 但是,我只需要第一个元素,事实上,我只需要一个数据,它位于JSON文件的开头,索引0。但是,JSON文件返回大约300组数据。我必须等到所有数据都准备好后才能继续 我想通过消除冗余数据集来加速API调用。我是否可以只接收第一组数据,而不必等到一切就绪后再对第一个元素进行索引 请原谅我的英语…提前谢谢。不。json不是“可流式”格式。在收到整个字符串之前,无法将其解码为本机结构。如果知道

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

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

我想通过消除冗余数据集来加速API调用。我是否可以只接收第一组数据,而不必等到一切就绪后再对第一个元素进行索引

请原谅我的英语…提前谢谢。

不。json不是“可流式”格式。在收到整个字符串之前,无法将其解码为本机结构。如果知道所需内容,则可以使用字符串操作检索所需部分,但这既不可靠也不可取。类似地,php不会在编码文本时将其流式输出

例如,考虑一个数据结构是Luooon浅数组

的情况
$x = array(
    0 => blah
    1 => blah
    ...
    999,999,998 => blah
    999,999,999 => array( .... even more nested data here ...)
);
流媒体格式会将其作为

['blah', 'blah' ............
您可以假设,除了顶层的那些“废话”之外,什么都没有,并输出一个
]
,以生成完整的json字符串:

['blah'....   , 'blah']
然后发送它,然后继续编码并到达子数组。。。现在你突然

['blah' ....., 'blah'][ ...sub array here ....]
现在它不再是有效的JSON


所以基本上,json编码是一次性完成的,而不是DIB和DRAB,只是因为你根本不知道“以后”会发生什么无需首先解析整个结构。

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

您可以使用fopen获取保证包含所需内容的字节,然后使用regex对其进行解析。比如:

$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。它将只是部分的

这取决于此API接受的参数。浏览手册中的参数,如:filter、itemsPerPage等。您是否不仅要更改服务器端逻辑?我知道您的意思,但这取决于实现。如果客户机和服务器同意,它可以像xml一样流式传输。看看这里的例子。顺便说一句,我不认为流式json的可能性是个问题。第一组数据之后的数据会被放在现有数据之前吗?如果没有,我们可以获取第一组数据,因为之前不会弹出任何内容,对吗?这看起来是一种可能的方法。然而,我知道有一个关键字:totalAmount=(一个数字),我想得到这个数字。关键字在第一组数据中是唯一的。你知道我能否得到那个号码吗?谢谢你的及时回复。非常感谢,这似乎非常接近。我检索到的数据如下所示,但我无法获取totalAmount后的数字…您可以再次修改吗?感谢您的帮助,:{“name”:“nameOTA”:“description”:“amount”:“1891.0”,“totalAmount”:“2088.9”,我在正则表达式中添加了更多的引号,您应该会得到它。仍然没有得到数字,我将继续修改正则表达式…我发现它应该类似于/“totalAmount”:“\d+。\d*”/我用regex在线工具测试了它,但无法在php中运行,数字没有显示。明白了,非常感谢您的帮助。如果(preg_match(“/”totalAmount“\:“\d+。。”d*“/”,$data,$match)){$totalAmount=$match[0];echo($totalAmount);