无法在JS中合并JSON
Cannot merge JSON in JS
我在合并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
函数。
它运行得几乎完美。问题只出在第二步。
- 第一步-调用
$.extend(jsonVar,data.d)
->data.d length 1000//jsonVar length 1000从0到999 Good:) - 第二步-调用
$.concat(jsonVar,data.d)
->data.d length 1000//jsonVar length 1001从0到1000错误:($.concat(jsonVar,data.d)
只将data.d中的最后一条记录添加到jsonVar - 第二步-调用
$.concat(jsonVar,data.d)
->data.d length 1000//jsonVar length 2001从0到1999几乎好:|$.concat(jsonVar,data.d)
添加所有记录 - 第二步-调用
$.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
返回错误,它不能返回未定义的length
(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 pairJson(data,i) {
if(jsonVar == undefined){
jsonVar = [{name:'delete me'}];
}
jsonVar = $.merge(jsonVar,data.d);
if(i == 0){
jsonVar.splice(0,1);
}
}
}
- JSON重构(合并内容)与javascript
- 将两个Json提要合并为一个,并按时间排序
- 如何使用jQuery合并两个json对象
- 遍历递归json树并合并
- 如何将多个 Blender JSON 模型合并到一个 Three.js Object3D 对象中
- 合并两个嵌套的JSON数组
- 是否有任何功能可以合并两个JSON数据集并替换旧信息?(节点.JS)
- 如果对象使用 reduce、forEach 或筛选器共享属性值,则合并 JSON 数组中的对象
- 合并 json 对象并保留重复的键
- 流类型和合并 json 对象
- 合并JSON并覆盖值
- 删除重复项并合并JSON对象
- D3:合并JSON对象条目
- 合并JSON数组
- 以更简单的方式合并JSON
- 按键合并JSON数据
- 如何在javascript中合并json数组与相同的值
- 合并JSON对象数组并使用Javascript进行排序
- 无法在JS中合并JSON
- 使用相同的“键”合并JSON对象,并使用JavaScript添加它们的“值”