JSON.stringify(对象)不正确

时间:2012-01-23 21:49:24

标签: javascript arrays json object

很抱歉我的上一个问题太混乱了,我很困惑自己,但现在我得到了一个恰当的例子:

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)的输出错误。 是什么原因造成的?

6 个答案:

答案 0 :(得分:12)

您首先构建一个数组([]),然后使用非数字键(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)作为键。

答案 1 :(得分:3)

如果您在JSON中定义对象,那么您的生活会更容易:

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

答案 2 :(得分:1)

您正在使用命名数组indeces而不是对象键/值对。

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));

答案 3 :(得分:1)

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";

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:1)

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

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"]