Требуется ли JSON.parse() двойное цитирование?
Я использую Firefox 3.5b4.
Это предупреждает об объекте объекта, объекте объекта:
var jsonString = '[{"foo": "one", "bar": 1}, {"foo": "two", "bar": 2}]';
var jsonObjects = JSON.parse(jsonString);
alert(jsonObjects);
Это предупреждает пустую строку, то есть jsonObjects имеет значение null.
var jsonString = "[{'foo': '1', 'bar': 2}, {'foo': '3', 'bar': 4}]";
var jsonObjects = JSON.parse(jsonString);
alert(jsonObjects);
Аналогично для имен некотируемых свойств, то есть {foo: '1', bar: 2}.
Что происходит? Мне что-то не хватает, или есть правило о двойном и одинарном цитировании с JSON.parse? Все три версии работают нормально с eval.
Ответы
Ответ 1
Стандарт JSON предусматривает двойные кавычки.
Помните, что JSON - это не просто "написать объект JS". Это очень строгий синтаксис, который также можно прочитать как объект JS. Не каждый JS-действительный синтаксис действителен JSON. Фактически, ваш пример не является действительно действительным JSON, так как он представляет собой массив объектов, в то время как стандарт указывает, что верхняя конструкция ДОЛЖНА быть объектом.
Конечно, большинство парсеров JSON более гибкие, что позволяет использовать нестандартные опции (например, одинарные кавычки); но не полагайтесь на это.
Ответ 2
Чтобы добавить к тому, что сказал Хавьер, JSON ограничивает формат главным образом соображениями безопасности (так что функции не могут быть вызваны и т.д.). Если вас не беспокоит безопасность, используйте функцию javascript "eval()", чтобы преобразовать строку в объект.