【问题标题】:Convert javascript object or array to json for ajax data将 javascript 对象或数组转换为 json 以获取 ajax 数据
【发布时间】:2013-11-27 00:42:23
【问题描述】:

所以我正在创建一个包含元素信息的数组。我遍历所有元素并保存索引。由于某种原因,我无法将此数组转换为 json 对象!

这是我的数组循环:

var display = Array();
$('.thread_child').each(function(index, value){
   display[index]="none";
   if($(this).is(":visible")){
      display[index]="block";
   }
});

我尝试通过以下方式将其转换为 JSON 对象:

data = JSON.stringify(display);

它似乎没有发送正确的 JSON 格式!

如果我这样编写代码,它可以工作并发送信息:

data = {"0":"none","1":"block","2":"none","3":"block","4":"block","5":"block","6":"block","7":"block","8":"block","9":"block","10":"block","11":"block","12":"block","13":"block","14":"block","15":"block","16":"block","17":"block","18":"block","19":"block"};

当我对 JSON.stringify 对象发出警报时,它看起来与手动编码的对象相同。但它不起作用。

我要疯了才想解决这个问题!我在这里想念什么?发送此信息以获取手动编码格式的最佳方式是什么?

我正在使用这个ajax方法发送数据:

$.ajax({
        dataType: "json",
        data:data,
        url: "myfile.php",
        cache: false,
        method: 'GET',
        success: function(rsp) {
            alert(JSON.stringify(rsp));
        var Content = rsp;
        var Template = render('tsk_lst');
        var HTML = Template({ Content : Content });
        $( "#task_lists" ).html( HTML );
        }
    });

使用 GET 方法,因为我正在显示信息(不更新或插入)。只向我的 php 文件发送显示信息。


结束解决方案


var display = {};
$('.thread_child').each(function(index, value){
   display[index]="none";
   if($(this).is(":visible")){
      display[index]="block";
   }
});

$.ajax({
        dataType: "json",
        data: display,
        url: "myfile.php",
        cache: false,
        method: 'GET',
        success: function(rsp) {
            alert(JSON.stringify(rsp));
        var Content = rsp;
        var Template = render('tsk_lst');
        var HTML = Template({ Content : Content });
        $( "#task_lists" ).html( HTML );
        }
    });

【问题讨论】:

  • 你的意思是使用JSON.parse?
  • Console.log 您的数据变量。数据 = JSON.stringify(显示);控制台.log(数据);看看你得到了什么。
  • 干脆不转换数据。
  • ["block","block","block","block","block","block","block","block","block","block"," block","block","block","block","block","block","block","block","block","block"] 它缺少数字.. "0":"块","1":"块"...

标签: javascript arrays json stringify


【解决方案1】:

我不完全确定,但我认为您可能对 JSON 中数组的序列化方式感到惊讶。让我们隔离问题。考虑以下代码:

var display = Array();
display[0] = "none";
display[1] = "block";
display[2] = "none";

console.log( JSON.stringify(display) );

这将打印:

["none","block","none"]

这就是 JSON 实际序列化数组的方式。但是你想看到的是这样的:

{"0":"none","1":"block","2":"none"}

要获得这种格式,您需要序列化对象,而不是数组。所以让我们像这样重写上面的代码:

var display2 = {};
display2["0"] = "none";
display2["1"] = "block";
display2["2"] = "none";

console.log( JSON.stringify(display2) );

这将以您想要的格式打印。

你可以在这里玩这个:http://jsbin.com/oDuhINAG/1/edit?js,console

【讨论】:

  • 所以你做了这一切......然后你什么都不会转换!数据:display2,数据类型:“json”,一切正常
  • 当您使用 objectw 并具有数字索引时,您不必将它们放在引号中。即display2[0] = "none" 就足够了
  • 如果您想构建一个对象列表 - 即var list = [ { id: 1, status: "good" }, { id: 2, status: "Bad" } ] - 并将它们作为具有 id 和 status 属性的模型类型的 IEnumerable 列表传递给控制器​​操作,该怎么办?我的清单没有被填满。
【解决方案2】:

您可以将JSON.stringify(object) 与对象一起使用,我刚刚编写了一个函数,它将递归地将数组转换为对象,例如JSON.stringify(convArrToObj(array)),即以下代码(更多详细信息可以在this answer 上找到):

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}

为了使其更通用,您可以覆盖 JSON.stringify 函数,您不必再担心它,只需将其粘贴到页面顶部即可:

// Modify JSON.stringify to allow recursive and single-level arrays
(function(){
    // Convert array to object
    var convArrToObj = function(array){
        var thisEleObj = new Object();
        if(typeof array == "object"){
            for(var i in array){
                var thisEle = convArrToObj(array[i]);
                thisEleObj[i] = thisEle;
            }
        }else {
            thisEleObj = array;
        }
        return thisEleObj;
    };
    var oldJSONStringify = JSON.stringify;
    JSON.stringify = function(input){
        return oldJSONStringify(convArrToObj(input));
    };
})();

现在JSON.stringify 将接受arrays 或objects! (link to jsFiddle with example)


编辑:

这是另一个更高效的版本,尽管它可能不那么可靠(不确定 -- 这取决于 JSON.stringify(array) 总是 是否返回 [],我不这样做'看不出它为什么不这样做的太多原因,所以这个函数应该更好,因为当你使用 JSON.stringify 和 object 时,它的工作量会更少):

(function(){
    // Convert array to object
    var convArrToObj = function(array){
        var thisEleObj = new Object();
        if(typeof array == "object"){
            for(var i in array){
                var thisEle = convArrToObj(array[i]);
                thisEleObj[i] = thisEle;
            }
        }else {
            thisEleObj = array;
        }
        return thisEleObj;
    };
    var oldJSONStringify = JSON.stringify;
    JSON.stringify = function(input){
        if(oldJSONStringify(input) == '[]')
            return oldJSONStringify(convArrToObj(input));
        else
            return oldJSONStringify(input);
    };
})();

jsFiddle with example here

js Performance test here, via jsPerf

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2015-08-27
    相关资源
    最近更新 更多