Каково различие между Нотацией Литерала объектов и JSON?

Кто-то может сказать мне, каково основное различие между объектом JavaScript, определенным при помощи Нотации Литерала объектов и объектом JSON?

Согласно книге JavaScript это говорит, что это - объект, определенный при помощи Объектной нотации:

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

Почему это не объект JSON в этом случае? Просто, потому что это не определяется при помощи кавычек?

208
задан Kamil Kiełczewski 19 June 2019 в 08:20
поделиться

3 ответа

Давайте сначала проясним, что такое JSON на самом деле. JSON - это текстовый , не зависящий от языка формат обмена данными, очень похожий на XML, CSV или YAML.

Данные могут храниться разными способами, но если они должны храниться в текстовом файле и читаться компьютером, они должны иметь некоторую структуру. JSON - один из многих форматов, определяющих такую ​​структуру.

Такие форматы обычно не зависят от языка, то есть они могут обрабатываться Java, Python, JavaScript, PHP и т. Д.

Напротив, JavaScript - это язык программирования. Конечно, JavaScript также предоставляет способ определения / описания данных, но синтаксис очень специфичен для JavaScript.

В качестве встречного примера в Python есть концепция кортежей , их синтаксис (x, y) . В JavaScript такого нет.


Давайте посмотрим на синтаксические различия между объектными литералами JSON и JavaScript.

JSON имеет следующие синтаксические ограничения:

  • Ключи объекта должны быть строками (то есть последовательностью символов, заключенной в двойные кавычки ").
  • Возможные значения:
    • строка
    • число
    • объект (JSON)
    • массив
    • истина
    • ложь
    • ноль
  • повторяющиеся ключи ( {"foo": " bar "," foo ":" baz "} ) выдают неопределенные, зависящие от реализации результаты; спецификация JSON специально не определяет их семантику

. В JavaScript объектные литералы могут иметь

  • строковые литералы, числовые литералы или имена идентификаторов в качестве ключей (начиная с ES6, теперь можно вычислять ключи, что вводит еще один синтаксис).
  • Значения могут быть любым допустимым выражением JavaScript, включая определения функций и undefined .
  • Дублирующиеся ключи дают определенные, указанные результаты (в свободном режиме последнее определение заменяет первое; в строгом режиме это ошибка).

Зная, что, просто взглянув на синтаксис , ваш пример не является JSON по двум причинам:

  1. Ваши ключи не являются строками (литералами). Это имена идентификаторов .
  2. Вы не можете присвоить функцию как значение «объекту JSON» (поскольку 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» .

239
ответ дан 23 November 2019 в 04:41
поделиться

JSON имеет гораздо более ограниченный синтаксис, в том числе:

  • Ключевые значения должны быть заключены в кавычки
  • Строки должны быть заключены в кавычки с помощью ", а не '
  • У вас более ограниченный диапазон значений (например, функции не разрешены)
40
ответ дан 23 November 2019 в 04:41
поделиться

Насколько я понимаю, основное отличие заключается в гибкости .

JSON - это своего рода оболочка для «нотации объектов JavaScript», которая заставляет пользователей подчиняться более строгим правилам определения объектов. И это достигается за счет ограничения возможных способов объявления объектов, предоставляемых функцией JavaScript Object Notation.

В результате мы получаем более простые и стандартизированные объекты, которые лучше подходят для обмена данными между платформами.

По сути, newObject в моем примере выше - это объект, определенный с помощью JavaScript Objeect Notation; но это не «действительный» объект JSON, потому что он не соответствует правилам, требуемым стандартами JSON.

Эта ссылка также очень полезна: http://msdn.microsoft.com/en-us/library/bb299886.aspx

1
ответ дан 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: