无法在JS中合并JSON

Cannot merge JSON in JS

本文关键字:合并 JSON JS      更新时间:2023-09-26

我在合并JSON时遇到问题。

我有一个ajax查询,它要求我的数据库提供记录。不幸的是,我必须设置退货记录限制(1000条记录)。在我的数据库中有3122条记录。这意味着我必须创建4个查询。我接收来自数据库的JSON记录。每次查询后,我都会尝试将旧的JSON与新的JSON合并。不幸的是,现在我只覆盖旧的JSON。

示例JSON答案:

"d":[

"数据":{

"姓名":"约翰","姓氏":"史密斯","年份":"21"

},"城市":"新建约克","华尔街":"华尔街街道"

},{

"数据":{

"姓名":"乔治","姓氏":"史密斯","年份":"26"

},"城市":"拉斯维加斯","街道":"Ceasar"

}]"

所有返回的JSON都具有相同的结构,但数据不同。

我的JS代码看起来像这样:

var jsonVar;
function createQuery(itemCount) {
    var top = 1000;
    var skip = 0;
    var urlQuery = databaseURL+skip;
    if (itemCount > 1000) {
        var loopQuery = Math.round(itemCount / 1000);
        for (var i = 0; i < loopQuery + 1; i++) {
            skip = 1000 * i;
            urlQuery = databaseURL+skip;
            var call = $.ajax({
                url: urlQuery,
                type: "GET",
                dataType: "json",
                async: false,
                headers: {
                    Accept: "application/json;odata=verbose"
                },
                success: function (data, textStatus, jqXHR) {
                    merge(jqXHR);
                }
            });
        }
      alert(jsonVar.responseText);
    } else {
    }

    function merge(jqXHR) {
        alert(jqXHR.responseText);
        jsonVar = $.extend(jsonVar, jqXHR);
    }

在第一步中,jsonVar为空,但jqXHR包含1000条记录。

第二步jsonVar=1000,jqXHR=1000

第三步jsonVar=1000,jqXHR=1000//jsonVar必须包含2000条记录

第四步jsonVar=1000,jqXHR=122//jsonVar必须包含3000条记录

在中

alert(jsonVar.responseText)否则,jsonVar必须包含3122条记录,但只有122条。

知道我做错了什么吗?


编辑

我对代码做了一些修改。

我几乎解决了我的问题,但就像我写的那样——"几乎"

我的merge函数调用了四次。$.extend$.merge正在覆盖以前的值,因为所有JSON都有相同的参数。

这就是为什么在merge()中添加了$.concat函数。

它运行得几乎完美。问题只出在第二步。

  1. 第一步-调用$.extend(jsonVar,data.d)->data.d length 1000//jsonVar length 1000从0到999 Good:)
  2. 第二步-调用$.concat(jsonVar,data.d)->data.d length 1000//jsonVar length 1001从0到1000错误:($.concat(jsonVar,data.d)只将data.d中的最后一条记录添加到jsonVar
  3. 第二步-调用$.concat(jsonVar,data.d)->data.d length 1000//jsonVar length 2001从0到1999几乎好:|$.concat(jsonVar,data.d)添加所有记录
  4. 第二步-调用$.concat(jsonVar,data.d)->data.d length 122//jsonVar length 2123从0到2122几乎好:|$.concat(jsonVar,data.d)添加所有记录

我不知道为什么在步骤2中,只有data.d中的最后一条记录被添加到jsonVar 中

这是我的代码

var jsonVar;
function createQuery(itemCount) {
    var top = 1000;
    var skip = 0;
    var urlQuery = databaseURL+skip;
    if (itemCount > 1000) {
        var loopQuery = Math.round(itemCount / 1000);
        for (var i = 0; i < loopQuery + 1; i++) {
            skip = 1000 * i;
            urlQuery = databaseURL+skip;
            var call = $.ajax({
                url: urlQuery,
                type: "GET",
                dataType: "json",
                async: false,
                headers: {
                    Accept: "application/json;odata=verbose"
                },
                success: function (data, textStatus, jqXHR) {
                    merge(data);
                }
            });
        }
    } else {
    }

    function merge(data, i) {
        alert(data.responseText);
        if(i == 0){
            jsonVar = $.extend(jsonVar,data.d);
        }else{
            jsonVar = $.concat(jsonVar,data.d);
        }
            $.concat||$.extend({concat:function(b,c){var a=[];for(x in arguments)a=a.concat(arguments[x]);return a}});
    }

在给定的代码中,合并函数内的行

 jsonVar = $.extend(jsonVar, jqXHR);

会产生问题,因为您正在扩展jsonVar中的jqXHR(它是XMLHTTPRequest对象的超集)属性。

试试这个代码,

var tempdata = $.parseJSON(jqXHR.responseText);
jsonVar = $.merge(jsonVar,tempdata.d);

试试这个示例代码:

var tempData =    {
"d":[
{
"data":{
"name":"John","surname":"Smith","year":"21"
},"city":"New York","Street":"Wall Street"
},{
"data":{
"name":"George","surname":"Smith","year":"26"
},"city":"Las Vegas","Street":"Ceasar"
}]
}
var jsonVar =    [
{
"data":{
"name":"John","surname":"Smith","year":"21"
},"city":"New York","Street":"Wall Street"
},{
"data":{
"name":"George","surname":"Smith","year":"26"
},"city":"Las Vegas","Street":"Ceasar"
}];
jsonVar = $.merge(jsonVar,tempData.d);
console.log(jsonVar);

非常感谢@RakeshChouhan。

我修改了一点代码,感谢$.merge能像我想要的那样工作。

在第一步中,我将向jsonVar添加一个对象,合并后将其删除

我这样做是因为在开始的jsonVar是空的,而$.merge返回错误,它不能返回未定义的lengthjsonVar是空的)。

这是我的代码:

var jsonVar;
function createQuery(itemCount) {
    var top = 1000;
    var skip = 0;
    var urlQuery = databaseURL+skip;
    if (itemCount > 1000) {
        var loopQuery = Math.round(itemCount / 1000);
        for (var i = 0; i < loopQuery + 1; i++) {
            skip = 1000 * i;
            urlQuery = databaseURL+skip;
            var call = $.ajax({
                url: urlQuery,
                type: "GET",
                dataType: "json",
                async: false,
                headers: {
                    Accept: "application/json;odata=verbose"
                },
                success: function (data, textStatus, jqXHR) {
                    merge(data);
                }
            });
        }
    } else {
    }

    function pairJson(data,i) {
        if(jsonVar == undefined){
            jsonVar = [{name:'delete me'}];
        }
        jsonVar = $.merge(jsonVar,data.d);
        if(i == 0){
            jsonVar.splice(0,1);
        }
    }
}