很抱歉我的上一个问题太混乱了,我很困惑自己,但现在我得到了一个恰当的例子:
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)
的输出错误。
是什么原因造成的?
答案 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)
entities
,entities["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";
你出错的地方:
a
用作数组,则写入[“1”] 是错误的。object.entities.player
或object.entities["player"]
。