使用切片解析JSON时性能是个问题吗?

时间:2016-03-28 21:58:14

标签: jquery json ajax parsing slice

我是JSON领域的新人,过去一周我就该主题进行了大量研究,仅显示了一定的数量并使用了一个按钮点击来显示我之后的X计数最初加载12.我已经学会了如何用PHP调用API,extract data from the JSON,使用带有PHP的foreach语句来输出JSON内容,但是如果性能没有找到明确答案或解释的好运当我使用按钮显示下一个数量时,它会生效。

我正在调用的JSON有超过100个对象,每个对象最多有20个值(阅读here后我的术语理解)并且每小时用PHP更新一次。我认为在阅读如何limit the statement

之后,使用PHP渲染前12个将是一个很好的表现
$showList = 12;
$countRecords = 0;
foreach($products as $product) {
    if ($countRecords < $showList) {
        // more code
    }
    ++$countRecords;
}

并阅读一些建议在服务器端执行此操作的问题。

在引用有关如何创建按钮的几个问题之后单击以加载接下来的12个计数我担心使用.slice()会妨碍性能,因为它看起来每次都会遍历整个文件内容:

我确实看到了另一种方法,其中添加了一个隐藏的类,该按钮删除了该类,但不会失败,但

使用AJAX的另一种方法:

我确实考虑过修改计数器:

如果我有一个大型JSON文件或.slice()没有效果,那么使用Ajax按钮点击加载更多对象的适当执行是什么,如果我没有延迟返回或阻碍性能?

1 个答案:

答案 0 :(得分:1)

据我所知,jQuery(或任何客户端)的任何解决方案在你限制它之前仍会返回整个JSON,因为你这样做的目的是性能,这是非常没用的。

您需要限制返回的JSON服务器端。你仍然可以使用jQuery来实现ajax,但不是直接调用你的JSON,而是创建一个限制响应的PHP文件。

的jQuery

// set initial variables
var limit = 10;
var offset = 0;

// get data on button click
$.('#load-more').on('click', function(){
    getData();
});

function getData() {
    $.ajax({
        url:"ajax.php",
        type: "POST",
        data: { limit: limit, offset: offset },
        success: function(json) {

            // increase offset for next call
            offset++;

            // do something with your JSON
        },
   });
}

ajax.php

// get your POST variables
if( isset($_POST['limit']) ) $limit = (int)$_POST['limit'];
if( isset($_POST['offset']) ) $offset = (int)$_POST['offset'];

// get your JSON
if ( isset($limit) && isset($offset) ) {

    $from = ($offset + 1) * $limit;
    $to   = $from + $limit;

    $json = // get JSON objects $from to $to        

    echo $json;        
}

如何在ajax.php中获得正确的JSON结果取决于您获取和/或存储JSON的方式。

  • 如果您正在进行API调用,请查看API具有的限制/偏移量参数。根据API,您可以使用$offset&amp; $limit$from&amp; $to。如果你这样做,虽然你可以直接从你的ajax电话来做。

  • 如果您将JSON存储在数据库中,您可以通过MYSQL查询获得结果。

  • 如果您拥有的是一个JSON字符串/文件,您可以像第一个PHP示例一样遍历它。这样的事情:

// get your POST variables
if( isset($_POST['limit']) ) $limit = (int)$_POST['limit'];
if( isset($_POST['offset']) ) $offset = (int)$_POST['offset'];

// get your JSON
if ( isset($limit) && isset($offset) ) {

    // limit & offset
    $from = ($offset + 1) * $limit;
    $to   = $from + $limit;

    // get existing json
    $products = json_decode($existing_json, true);
    $countRecords = 0;
    $products_to_return = array();

    foreach($products as $product) {

        // skip to next product if we are before $from
        if ($countRecords < $from) continue;

        // end the loop if we are after $to
        if ($countRecords > $to) break;

        $products_to_return[] = $product;

        ++$countRecords;
    }

    // encode your new limited json
    $json = json_encode($products_to_return);

    echo $json;        
}

注意 - 这些代码都没有经过测试,很可能已经充满了错误(已经很晚了!)但是它可以让你知道该怎么做