【问题标题】:Why do I get square brackets when trying to convert array to JSON string using stringify为什么在尝试使用 stringify 将数组转换为 JSON 字符串时出现方括号
【发布时间】:2013-10-24 19:45:12
【问题描述】:

当我尝试使用 JSON.stringify 将下面的数组转换为字符串时,我只能看到空方括号。我尝试使用 console.log 进行调试,但我确实看到了要转换为字符串的数据,那么我在这里做错了什么?任何帮助将不胜感激!

function jsonSuccess( data ){

        var jsonArr = new Array();

        for( var i = 0; i < data.length; i++ ){
            var shipInfo = new Array();
            var shipRows = new Array();

            $.each( data[i], function( key, value ){


                if ( key == "EniNumber" ) {
                    shipInfo['E'] = value;
                    //console.log( shipInfo.E );
                }

                if ( key == "Name" ) {
                    shipInfo['N'] = value;
                }

                if ( key == "StartDate" ) {
                    shipInfo['S'] = value;
                }

                if ( key == "Rows" ) {

                    $.each( value, function( subKey, subValue ){

                        var rowContent = {
                            "T": subValue.T,
                            "X": subValue.X,
                            "Y": subValue.Y,
                            "D": subValue.D
                        }

                        shipRows.push( rowContent );

                    });

                    shipInfo['R'] = shipRows;
                }

            });


            jsonArr[i] = shipInfo;

            var myJsonString = JSON.stringify(jsonArr);
            console.log(myJsonString);
        }

    }

【问题讨论】:

  • shipInfo 不是一个数组,它是一个对象,所以试试var shipInfo = {};
  • 您的数组没有任何值,而是有属性。因此,[] 是您记录它时的预期控制台值。它的长度也是 0。

标签: javascript jquery stringify square-bracket


【解决方案1】:

您正在使用数组作为对象。

在 Javascript 中,您有数组和对象。但是你可能知道数组也是对象,这有一些奇怪的含义。

var arr = [];
arr[0] = "foo"; // this is fine
console.log(JSON.stringify(arr)); // [ "foo" ]
arr.length; // 1 ok

但是既然数组是一个对象,我们也可以赋值属性:

arr.foo = "bar";
console.log(arr); // [ 0: "foo", foo: "bar" ]
console.log(JSON.stringify(arr)); // [ "foo" ] .. where did bar go?
arr.length; // 1 huh?

我们正在混合数组值和对象属性。

JSON 编码器查看对象并发现它是一个(实例)Array 并将其序列化。它查看arr.length(在示例中为 1),因此您只得到[ "foo" ]。数组上的属性被忽略。


了解数组值和对象属性之间的区别很重要。 JavaScript 中的数组从不具有关联性。如果你在一个数组上设置一个属性,它不会增加长度,如果你在 for 循环中循环它,它也不会显示。


变化:

var shipInfo = new Array();

收件人:

var shipInfo = {};

【讨论】:

  • 我从您的第二个代码 sn-p 得到的输出略有不同。 [foo: "bar"][] 和 0 而不是 1。但我怀疑其中很多只是不同的浏览器在控制台中对它的解释不同。不过还是很好的解释。我用铬。
  • 感谢您的解释!我不习惯 javascript,但我很高兴看到有人在我发布后立即帮助我。 :D
【解决方案2】:

shipInfo 不是数组,它是一个对象,所以试试var shipInfo = {};

演示:ProblemSolution

【讨论】:

  • 感谢阿伦的帮助!
猜你喜欢
  • 2013-02-28
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2022-01-08
相关资源
最近更新 更多