Кто-то может сказать мне, каково основное различие между объектом JavaScript, определенным при помощи Нотации Литерала объектов и объектом JSON?
Согласно книге JavaScript это говорит, что это - объект, определенный при помощи Объектной нотации:
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
Почему это не объект JSON в этом случае? Просто, потому что это не определяется при помощи кавычек?
Давайте сначала проясним, что такое JSON на самом деле. JSON - это текстовый , не зависящий от языка формат обмена данными, очень похожий на XML, CSV или YAML.
Данные могут храниться разными способами, но если они должны храниться в текстовом файле и читаться компьютером, они должны иметь некоторую структуру. JSON - один из многих форматов, определяющих такую структуру.
Такие форматы обычно не зависят от языка, то есть они могут обрабатываться Java, Python, JavaScript, PHP и т. Д.
Напротив, JavaScript - это язык программирования. Конечно, JavaScript также предоставляет способ определения / описания данных, но синтаксис очень специфичен для JavaScript.
В качестве встречного примера в Python есть концепция кортежей , их синтаксис (x, y)
. В JavaScript такого нет.
Давайте посмотрим на синтаксические различия между объектными литералами JSON и JavaScript.
JSON имеет следующие синтаксические ограничения:
"
). истина
ложь
ноль
{"foo": " bar "," foo ":" baz "}
) выдают неопределенные, зависящие от реализации результаты; спецификация JSON специально не определяет их семантику . В JavaScript объектные литералы могут иметь
undefined
. Зная, что, просто взглянув на синтаксис , ваш пример не является JSON по двум причинам:
Но самое главное, повторю мое объяснение с самого начала: вы находитесь в контексте JavaScript. Вы определяете объект JavaScript. Если есть, то «объект JSON» может содержаться только в строке:
var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
var json = '{"foo": 452}'; // creates a string containing JSON
То есть, если вы пишете исходный код JavaScript и не имеете дело со строкой , вы не имеете дело с JSON. Возможно, вы получили данные как JSON (например, через ajax или чтение из файла), но как только вы или используемая вами библиотека проанализируете их, это больше не JSON.
Только потому, что литералы объектов и JSON выглядят похожими , это не означает, что вы можете называть их взаимозаменяемыми. См. Также Не существует такой вещи, как «объект JSON» .
JSON имеет гораздо более ограниченный синтаксис, в том числе:
"
, а не '
Насколько я понимаю, основное отличие заключается в гибкости .
JSON - это своего рода оболочка для «нотации объектов JavaScript», которая заставляет пользователей подчиняться более строгим правилам определения объектов. И это достигается за счет ограничения возможных способов объявления объектов, предоставляемых функцией JavaScript Object Notation.
В результате мы получаем более простые и стандартизированные объекты, которые лучше подходят для обмена данными между платформами.
По сути, newObject в моем примере выше - это объект, определенный с помощью JavaScript Objeect Notation; но это не «действительный» объект JSON, потому что он не соответствует правилам, требуемым стандартами JSON.
Эта ссылка также очень полезна: http://msdn.microsoft.com/en-us/library/bb299886.aspx