Может кто-нибудь сказать мне, в чем заключается основное различие между объектом JavaScript, определенным с помощью Object Literal Notation и объекта JSON ?
Согласно книге на JavaScript это говорит, что это объект, определенный с помощью нотации объекта :
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
Почему в этом случае это не объект JSON? Только потому, что это не определяется с помощью кавычек?
javascript
json
object-notation
pencilCake
источник
источник
Ответы:
Давайте сначала уточнить, что такое JSON . JSON - это текстовый , независимый от языка формат обмена данными, очень похожий на XML, CSV или YAML.
Данные могут храниться разными способами, но если они должны храниться в текстовом файле и быть доступными для чтения на компьютере, они должны следовать определенной структуре. JSON является одним из многих форматов, определяющих такую структуру.
Такие форматы обычно не зависят от языка, то есть они могут обрабатываться Java, Python, JavaScript, PHP, как вы это называете.
С другой стороны, JavaScript - это язык программирования. Конечно, JavaScript также предоставляет способ определения / описания данных, но синтаксис очень специфичен для JavaScript.
В качестве встречного примера у Python есть концепция кортежей , их синтаксис есть
(x, y)
. JavaScript не имеет ничего подобного.Давайте посмотрим на синтаксические различия между объектными литералами JSON и JavaScript.
JSON имеет следующие синтаксические ограничения:
"
).true
false
null
{"foo":"bar","foo":"baz"}
) дают неопределенные, специфичные для реализации результаты; спецификация JSON специально не определяет их семантикуВ JavaScript объектные литералы могут иметь
undefined
.Зная, что, просто взглянув на синтаксис , ваш пример не является JSON по двум причинам:
Но самое главное, повторить мое объяснение с самого начала: вы находитесь в контексте JavaScript. Вы определяете объект JavaScript. Если таковой имеется, «объект JSON» может содержаться только в строке:
То есть, если вы пишете исходный код JavaScript и не имеете дело со строкой , вы не имеете дело с JSON. Возможно, вы получили данные в виде JSON (например, через ajax или чтение из файла), но как только вы или используемая вами библиотека проанализировали их, это больше не JSON.
Только потому, что объектные литералы и JSON выглядят одинаково , это не значит, что вы можете называть их взаимозаменяемо. Смотрите также Там нет такого понятия, как "JSON Object" .
источник
JSON имеет гораздо более ограниченный синтаксис, включая:
"
а не'
источник
На самом деле не существует такого понятия, как «объект JSON».
Спецификация JSON - это синтаксис для кодирования данных в виде строки. То, что люди называют «JSON-объект» (в javascript), на самом деле является обычным javascript-объектом, который (вероятно) был десериализован из допустимой строки JSON, и его можно легко повторно сериализовать как допустимую строку JSON. Обычно это означает, что он содержит только данные (а не функции). Это также означает, что даты отсутствуют, потому что в JSON нет типа даты (вероятно, самая болезненная вещь в JSON;)
Более того, (побочный характер ...), когда люди говорят о «объекте JSON», они почти всегда имеют в виду данные, которые имеют «фигурные скобки» на верхнем уровне. Это хорошо соответствует объекту javascript. Однако спецификация JSON не требует наличия единственного объекта «фигурных скобок» на верхнем уровне строки JSON. Для JSON вполне допустимо иметь список на верхнем уровне или даже иметь только одно значение. Таким образом, хотя каждый «объект JSON» соответствует действительному JSON, не все допустимые строки JSON соответствуют тому, что мы назвали бы «объектом JSON»! (потому что строка может представлять список или атомарное значение)
источник
JSON-text = object / array
.Согласно JSON в JavaScript ,
Другими словами, допустимый JSON также является действительной буквенной нотацией объекта JavaScript, но не обязательно наоборот.
В дополнение к чтению документации , как предложил @Filix King, я также предлагаю поиграть с онлайн-валидатором JSON JSONLint . Вот как я узнал, что ключи объектов JSON должны быть строками.
источник
SON JSON : обезжиренная альтернатива XML
JSON получил широкое распространение среди людей, которые обнаружили, что это значительно облегчает создание распределенных приложений и сервисов. Официальный тип интернет - СМИ для JSON это
application/json
RFC 4627
. В именах файлов JSON используется расширение.json
.► JavaScript Object Notation (
JSON
) - это легкий текстовый формат обмена данными, не зависящий от языка. JSON используется для обмена данными между приложениями, написанными на любом языке программирования.JSON является подмножеством JavaScript. Javascript был получен из стандарта языка программирования ECMAScript.
► ECMAScript
ECMAScript стал одним из самых широко используемых в мире языков программирования общего назначения. Он наиболее известен как язык, встроенный в веб-браузеры, но также широко применяется для серверных и встроенных приложений. ECMAScript основан на нескольких исходных технологиях, наиболее известными из которых являются
JavaScript
(Netscape Communications) иJScript
Microsoft Corporation.) .Хотя до 1994 года ECMA была известна как «Европейская ассоциация производителей компьютеров», после 1994 года, когда организация стала глобальной, «торговая марка» «Ecma» сохранилась по историческим причинам.ECMAScript - это язык, тогда как JavaScript, JScript и даже ActionScript называются
"Dialects"
.Информация о браузере и компьютере ваших пользователей.
ECMAScript - это язык сценариев, который лежит в основе JavaScript. ,
JavaScript
language resources
ECMA-262
Links
Initial Edition, June 1997
PDF.
2nd Edition, August 1998
PDF.
3rd Edition, December 1999
PDF.
5th Edition, December 2009
PDF.
5.1 Edition, June 2011
HTML.
6th Edition, June 2015
HTML.
7ᵗʰ Edition, June 2016
HTML.
8th edition, June 2017
HTML.
9th Edition, 2018
HTML.
ПРИМЕЧАНИЕ « 4-е издание ECMAScript не опубликовано, так как работа была неполной .
► Значения ключей должны быть в кавычках, для ключей допускаются только строки. Если вы используете не String, он будет преобразован в String. Но не рекомендуется использовать ключи, отличные от String. Проверьте пример как это -
{ 'key':'val' }
болееRFC 4627 - jsonformatter
► Строки JSON должны заключаться в кавычки "а не". Строка очень похожа на строку C или Java. Строки должны быть заключены в двойные кавычки.
Объект аксессоры собственности обеспечивают доступ к свойствам объекта с помощью точечной нотации или брекета обозначения.
► У вас есть более ограниченный диапазон значений (например, функции не допускаются). Значение может быть строкой в двойных кавычках, числом, логическим значением, нулем, объектом или массивом. Эти структуры могут быть вложенными.
►
JavaScript
является наиболее популярной реализацией стандарта ECMAScript. Основные функции Javascript основаны на стандарте ECMAScript, но Javascript также имеет другие дополнительные функции, которых нет в спецификации / стандарте ECMA. У каждого браузера есть интерпретатор JavaScript.JavaScript - это динамически типизированный язык. Это означает, что вам не нужно указывать тип данных переменной при ее объявлении, а типы данных автоматически конвертируются по мере необходимости во время выполнения скрипта.
Literals
:Object literals
RFC 7159
Структура объекта представляется в виде пары фигурных скобок, окружающих ноль или более пар имя / значение (или членов). Имя - это строка. После каждого имени стоит двоеточие, отделяющее имя от значения. Одна запятая отделяет значение от следующего имени. Имена внутри объекта ДОЛЖНЫ быть уникальными.
ECMAScript поддерживает наследование на основе прототипов. Каждый конструктор имеет связанный прототип, и каждый объект, созданный этим конструктором, имеет неявную ссылку на прототип (называемый прототипом объекта), связанный с его конструктором. Кроме того, прототип может иметь ненулевую неявную ссылку на свой прототип и т. Д .; это называется прототипом цепи.
В объектно-ориентированном языке на основе классов в общем случае состояние передается экземплярами, методы - классами, а наследование имеет только структуру и поведение. В ECMAScript состояние и методы переносятся объектами, а структура, поведение и состояние наследуются.
Прототип - это объект, используемый для реализации наследования структуры, состояния и поведения в ECMAScript. Когда конструктор создает объект, этот объект неявно ссылается на связанный с конструктором прототип с целью разрешения ссылок на свойства. На связанный с прототипом конструктор может ссылаться выражение программы constructor.prototype, а свойства, добавленные в прототип объекта, передаются по наследству всем объектам, совместно использующим прототип.
источник
Для тех, кто все еще думает, что RFC важнее, чем блоги и заблуждения, основанные на мнениях, давайте попробуем ответить на некоторые вопросы. Я не собираюсь повторять все правильные различия, уже упомянутые в предыдущих ответах, здесь я просто пытаюсь добавить ценность, суммируя некоторые важные части rfc7159
Выдержки из https://tools.ietf.org/html/rfc7159
Примеры (со страницы 12 RFC)
Это объект JSON:
Его член Image является объектом, чей элемент Thumbnail является объектом, а член ID является массивом чисел.
В самом деле?
источник
Object
, этоString
. СпасибоНасколько я понимаю, главное отличие - это гибкость .
JSON - это своего рода оболочка для «JavaScript Object Notation», которая заставляет пользователей подчиняться более строгим правилам определения объектов. И это достигается путем ограничения возможных способов объявления объектов, предоставляемых функцией JavaScript Object Notation.
В результате мы имеем более простые и стандартизированные объекты, которые лучше подходят для обмена данными между платформами.
Таким образом, по сути, newObject в моем примере выше - это объект, определенный с помощью JavaScript Objeect Notation; но это не «действительный» объект JSON, потому что он не следует правилам, требуемым стандартами JSON.
Эта ссылка также весьма полезна: http://msdn.microsoft.com/en-us/library/bb299886.aspx
источник
Сначала вы должны знать, что такое JSON:
Это независимый от языка формат обмена данными. Синтаксис JSON был основан на нотации JavaScript Object Literal, но между ними есть различия.
Например, в JSON все ключи должны быть заключены в кавычки, а в объектных литералах это необязательно:
// JSON: {"foo": "bar"}
// Литерал объекта: var o = {foo: "bar"}; Кавычки обязательны для JSON, потому что в JavaScript (точнее в ECMAScript 3rd. Edition) использование зарезервированных слов в качестве имен свойств запрещено, например:
var o = {if: "foo"}; // SyntaxError в ES3 Хотя использование строкового литерала в качестве имени свойства (цитирование имени свойства) не вызывает проблем:
var o = {"if": "foo"}; Так что для «совместимости» (и, может быть, легко оценивать?) Кавычки обязательны.
Типы данных в JSON также ограничены следующими значениями:
строковый номер объектный массив Литерал как: true false null Грамматика строк изменяется. Они должны быть разделены двойными кавычками, в то время как в JavaScript вы можете использовать одинарные или двойные кавычки взаимозаменяемо.
// Неверный JSON: {"foo": 'bar'} Также меняется и принятая грамматика чисел JSON, в JavaScript вы можете использовать шестнадцатеричные литералы, например, 0xFF, или (печально известные) восьмизначные литералы, например, 010. В JSON вы можете использовать только десятичные литералы.
// Неверный JSON: {"foo": 0xFF}
источник
Javascript Object Literal против JSON:
JSON
Язык, который означает «объектов JavaScript», имеет свой синтаксис , полученный из объектов JavaScript буквального синтаксиса. Он используется как независимый от языка программирования формат текстовой передачи данных.Пример:
Обозначение объектов JS, используемое в JS для удобного создания объектов в коде:
Пример JSON:
Основные отличия:
Все ключи объекта в JSON должны быть строками. В Javascript объектными ключами могут быть строки или числа
Все строки в JSON должны быть заключены в "двойные кавычки". В то время как в Javascript допускаются как одинарные, так и двойные кавычки. Даже без кавычек в нотации объекта Javascript ключи объекта неявно преобразуются в строки.
В JSON функция не может быть определена как значение объекта (поскольку это зависит от Javascript). В Javascript это полностью законно.
Javascript встроить в
JSON
объект:JSON
объекты могут быть легко преобразованы в Javascript и наоборот, используя встроенныйJSON
объект, который Javascript предлагает во время выполнения. Например:источник
Вот одно удивительное отличие: вы не можете использовать
undefined
в json, и все поля объекта с неопределенными значениями исчезнут послеJSON.stringify
🙈🙉🙊
источник