JSON.stringify (объект) неверный - PullRequest
5 голосов
/ 24 января 2012

Извините за то, что мой последний вопрос был настолько запутанным, я запутался, но теперь у меня есть подходящий пример:

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 ]

12 голосов
/ 24 января 2012

Сначала вы строите массив ([]), затем присваиваете ему свойства с помощью нечисловых ключей (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) в качестве ключей.

3 голосов
/ 24 января 2012

Ваша жизнь была бы намного проще, если бы вы определили свои объекты в JSON для начала:

var obj = {
  'entities': [
    {'player':{'pos': '0,0'}}
  ]
};
1 голос
/ 24 января 2012

Вы путаете объекты с массивами.Следующий код будет работать.

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

Что пошло не так:

  1. Массив может иметь только целочисленные индексы.Поэтому некорректно писать ["1"] , если вы собираетесь использовать a в качестве массива .
  2. . Для правильной сериализации только объект может иметь именованные свойства, например object.entities.player или object.entities["player"].
1 голос
/ 24 января 2012

Я думаю, у вас есть некоторые серьезные заблуждения относительно массивов и объектов в javascript.Массив ([]) работает только с положительными целочисленными индексами.В вашем примере вы делаете следующее:

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

Вы говорите, что obj.entities - это массив, а затем вы используете player в качестве индекса.И player не является целым числом.Так что этот код не имеет смысла.С другой стороны, вы можете использовать объекты со свойствами.Эти свойства могут быть строками:

obj.entities = {};
obj.entities.player = [];
obj.entities.player[0] = 'foo bar';
1 голос
/ 24 января 2012

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";
1 голос
/ 24 января 2012

Вы используете именованные массивы индексов вместо пар ключ / значение объекта.

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...