JSON.stringfy(对象)不正确

JSON.stringify(object) incorrect

本文关键字:不正确 对象 stringfy JSON      更新时间:2023-09-26

很抱歉我的最后一个问题太令人困惑了,我很困惑,但现在我得到了一个合适的例子:

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

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

如果你用JSON定义你的对象,你的生活会轻松得多:

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

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

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

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

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

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

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

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

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

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