组合作为多个块发送的大型 JSON

我正在使用 cURL 和 PHP 来访问 Salesforce API,并且其中大部分都在工作。


当您请求大量记录时,Salesforce 会将数据分成 2000 块。


基本上,我有三个不同的大 JSON 块和记录数组,我想知道将它们组合成一个大对象的最佳方法是什么。


当有更多数据时,对象看起来像这样。


它为您提供了一个 nextRecordsUrl,您可以点击它来获取下一个块:


Array

(

    [totalSize] => 5000

    [done] => 

    [nextRecordsUrl] => /services/data/v20.0/query/somelongurlstring

    [records] => Array

        (

            [0] => Array

                (

                    [attributes] => Array

                        (

                            [type] => Custom_Type__c

                            [url] => sobjects/Custom_Type__c/thetypeid

                        )


                    [Requested_Prop__c] => someid

                )


            [1] => Array

                ( [...]

我的 curl 代码似乎正在运行 - 基本上是这样的:


curl_setopt($ch2, CURLOPT_URL, "https://my.instance.salesforce.com/services/data/v20.0/query/?q=" . urlencode($_GET["q"]));

curl_setopt($ch2, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer $token"));

curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, "GET");

curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, 1);

$isDone = false;

while(!$isDone) {

    $qresponse = curl_exec($ch2);

    echo "<pre>";

    $theJson = json_decode($qresponse, true);

    echo print_r($theJson);

    echo "</pre>";

    $isDone = $theJson["done"] == true;

    if(!$isDone)

        curl_setopt($ch2, CURLOPT_URL, "https://my.instance.salesforce.com" . $theJson["nextRecordsUrl"]);

}

curl_close($ch2);

问题是输出实际上是多个json对象。

我认为最简单的方法可能是简单地遍历记录并将它们附加到我在 PHP 中创建的某个 json 对象,但我担心的只是如果这些获取请求变得非常大可能需要的内存量。


有没有“正确的方法”来做到这一点?


慕村225694
浏览 121回答 1
1回答

小唯快跑啊

我最终只是自己附加数据:$isDone = false;$finalJson = array();while(!$isDone) {&nbsp; &nbsp; $qresponse = curl_exec($ch2);&nbsp; &nbsp; $theJson = json_decode($qresponse, true);&nbsp; &nbsp; $isDone = $theJson["done"] == true;&nbsp; &nbsp; foreach($theJson["records"] as $record) {&nbsp; //Only return records&nbsp; &nbsp; &nbsp; &nbsp; $finalJson[] = $record;&nbsp; &nbsp; }&nbsp; &nbsp; if(!$isDone)&nbsp; &nbsp; &nbsp; &nbsp; curl_setopt($ch2, CURLOPT_URL, "https://my.instance.salesforce.com" . $theJson["nextRecordsUrl"]);}echo "<pre>" . json_encode($finalJson, JSON_PRETTY_PRINT) . "</pre>";
打开App,查看更多内容
随时随地看视频慕课网APP