【问题标题】:JSON.stringify(object) incorrectJSON.stringify(object) 不正确
【发布时间】:2012-02-17 05:49:42
【问题描述】:

对不起,我的上一个问题如此混乱,我自己也很困惑,但现在我得到了一个合适的例子:

var obj = {};
obj.entities = [];
obj.entities["player"] = [];
obj.entities["player"]["0"] = [];
obj.entities["player"]["0"]["pos"] = "0,0";

var jsonStr = JSON.stringify(jsonObj);

// {"entities":[]}
console.log(JSON.stringify(obj));

如您所见,JSON.stringify(obj) 的输出是错误的。 这是什么原因造成的?

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:

    您首先构建一个数组 ([]),然后使用非数字键 (player) 为其分配属性。这在技术上是可行的(因为不会导致错误),但这不是数组的用途。

    您应该改用对象 ({})。此外,["player"].player 相同。

    var obj = {};
    obj.entities = {};
    obj.entities.player = []; // array here because you're filling with indices ([0])
    obj.entities.player[0] = {}; // object again, because non-indices as keys (`pos`)
    obj.entities.player[0].pos = "0,0";
    

    对象可以采用任何属性键。数组是对象的子集,它应该只有索引(数字>= 0)作为键。

    【讨论】:

    • 啊,感谢您的解释,我并不完全了解对象数组的差异。但我仍然可以做到obj.entities.player = {}; 然后obj.entities.player.pos = "0,0"; 不是吗?
    • @elias94xx:如果你有一名球员,那是可能的。虽然你写的["0"] 让我假设你有一个玩家列表(数组)。
    • 是的,抱歉,我暂时忘记了 id。 :)
    【解决方案2】:

    如果你在 JSON 中定义你的对象,你的生活会轻松很多:

    var obj = {
      'entities': [
        {'player':{'pos': '0,0'}}
      ]
    };
    

    【讨论】:

      【解决方案3】:

      您使用的是命名数组索引而不是对象键/值对。

      var obj = {};
      obj.entities = {};
      obj.entities["player"] = {};
      obj.entities["player"]["0"] = [];
      obj.entities["player"]["pos"] = "0,0";
      
      // {"entities":{"player":{"0":[],"pos":"0,0"}}}
      console.log(JSON.stringify(obj));
      

      【讨论】:

        【解决方案4】:

        entitiesentities["player"]entities["player"]["0"] 需要是对象,而不是数组。

        您正在向这些数组添加属性,而不是向它们推送值。这些自定义属性没有被字符串化。

        修复很简单:

        var obj = {};
        obj.entities = {};   //  <------------ this is an object now
        obj.entities["player"] = {};    // <--------- also an object
        obj.entities["player"]["0"] = {};   // <-------- and so on
        obj.entities["player"]["0"]["pos"] = "0,0";
        

        【讨论】:

          【解决方案5】:

          我认为您对 javascript 中的数组和对象有一些严重的困惑。数组 ([]) 仅适用于正整数索引。在您的示例中,您正在执行以下操作:

          obj.entities = [];
          obj.entities["player"] = [];
          

          您说obj.entities 是一个数组,然后您使用player 作为索引。而player 不是整数。所以这段代码没有意义。另一方面,您可以使用具有属性的对象。这些属性可以是字符串:

          obj.entities = {};
          obj.entities.player = [];
          obj.entities.player[0] = 'foo bar';
          

          【讨论】:

            【解决方案6】:

            您将对象与数组混淆了。以下代码将起作用。

            var obj = {};
            obj.entities = {};
            obj.entities.player = [];
            obj.entities.player[0] = {};
            obj.entities.player[0].pos = "0,0";
            

            你出错的地方:

            1. 数组只能有整数索引。因此,如果您打算将a 用作数组,则写入 ["1"] 是不正确的。
            2. 要正确序列化,只有对象可以具有命名属性,如object.entities.playerobject.entities["player"]

            【讨论】:

            • 请注意,键始终是字符串,因此["1"][1] 之间没有区别。最后一个只是更具语义性。
            猜你喜欢
            • 2015-01-24
            • 1970-01-01
            • 2015-11-11
            • 1970-01-01
            • 2013-05-05
            • 2017-12-30
            • 2013-04-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多