JSON ( JavaScript Object Notation , произносится / ˈ dʒ eɪ s ən / ; также / ˈ dʒ eɪ ˌ s ɒ n / ) — это открытый стандартный формат файлов и формат обмена данными , который использует удобочитаемый текст для хранения и передачи объектов данных, состоящих из пары и массивы атрибут-значение (или другие сериализуемые значения). Это широко используемый формат данных, который широко используется при электронном обмене данными , включая веб-приложения с серверами .
JSON — это независимый от языка формат данных. Он был создан на основе JavaScript , но многие современные языки программирования включают код для генерации и анализа данных в формате JSON. Имена файлов JSON имеют расширение .json
.
Дуглас Крокфорд первоначально определил формат JSON в начале 2000-х годов. [1] Он и Чип Морнингстар отправили первое сообщение JSON в апреле 2001 года.
Международный стандарт 2017 года (ECMA-404 и ISO/IEC 21778:2017) определяет, что «JSON» «произносится / ˈ dʒ eɪ . s ə n / , как в « Джейсон и аргонавты » . [2] [3] Первое (2013 г.) издание ECMA-404 не касалось произношения. [4] В « Руководстве по системному администрированию UNIX и Linux» говорится, что « Дуглас Крокфорд , который назвал и продвигал формат JSON, говорит, что он произносится как имя Джейсон. Но каким-то образом «JAY-sawn», похоже, стало более распространенным в техническом сообществе. ." [5] В 2011 году Крокфорд сказал: «Существует много споров о том, как это произносить, но меня это совершенно не волнует». [6]
После того, как RFC 4627 стал доступен в качестве «информационной» спецификации с 2006 года, JSON был впервые стандартизирован в 2013 году как ECMA -404. [7] RFC 8259, опубликованный в 2017 году, является текущей версией Интернет-стандарта STD 90 и остается совместимым с ECMA-404. [8] В том же году JSON был также стандартизирован как ISO / IEC 21778:2017. [2] Стандарты ECMA и ISO / IEC описывают только разрешенный синтаксис, тогда как RFC охватывает некоторые соображения безопасности и совместимости . [9]
JSON вырос из потребности в протоколе сеансовой связи между сервером и браузером в реальном времени без использования плагинов браузера, таких как Flash или Java- апплеты, — доминирующих методов, использовавшихся в начале 2000-х годов. [10]
Крокфорд первым определил и популяризировал формат JSON. [11] Аббревиатура возникла в компании State Software, соучредителями которой были Крокфорд и другие в марте 2001 года. Соучредители согласились создать систему, которая использовала бы стандартные возможности браузера и предоставляла веб-разработчикам уровень абстракции для создания веб-приложений с отслеживанием состояния. который имел постоянное дуплексное соединение с веб-сервером, удерживая открытыми два соединения протокола передачи гипертекста (HTTP) и повторно используя их до истечения стандартного времени ожидания браузера, если дальнейший обмен данными не осуществлялся. Соучредители провели круглый стол и проголосовали за то, называть ли формат данных JSML (язык разметки JavaScript) или JSON (нотация объектов JavaScript), а также под каким типом лицензии сделать его доступным. Веб-сайт JSON.org [12] был запущен в 2001 году. В декабре 2005 года Yahoo! начала предлагать некоторые из своих веб-сервисов в формате JSON. [13]
Предшественник библиотек JSON использовался в детском игровом проекте по торговле цифровыми активами под названием Cartoon Orbit на сайте Communities.com [ нужна ссылка ] (все соучредители штата ранее работали в этой компании) для Cartoon Network [ нужна цитата ] , которая использовал плагин на стороне браузера с собственным форматом сообщений для управления элементами DHTML (эта система также принадлежит 3DO ) . Обнаружив первые возможности Ajax , digiGroups, Noosh и другие использовали фреймы для передачи информации в поле зрения браузера пользователя без обновления визуального контекста веб-приложения, реализуя насыщенные веб-приложения в реальном времени, используя только стандартные возможности HTTP, HTML и JavaScript. Netscape 4.0.5+ и IE 5+. Затем Крокфорд обнаружил, что JavaScript можно использовать в качестве объектно-ориентированного формата обмена сообщениями для такой системы. Система была продана Sun Microsystems , Amazon.com и EDS .
JSON основан на подмножестве языка сценариев JavaScript (в частности, на стандарте ECMA -262, 3-е издание — декабрь 1999 г. [14] ) и обычно используется с JavaScript, но это независимый от языка формат данных. Код для анализа и генерации данных JSON доступен на многих языках программирования . На веб-сайте JSON библиотеки JSON перечислены по языкам.
В октябре 2013 года Ecma International опубликовала первое издание стандарта JSON ECMA-404. [7] В том же году в RFC 7158 в качестве ссылки использовался ECMA-404. В 2014 году RFC 7159 стал основной ссылкой для использования JSON в Интернете, заменив RFC 4627 и RFC 7158 (но сохранив ECMA-262 и ECMA-404 в качестве основных ссылок). В ноябре 2017 года ISO/IEC JTC 1/SC 22 опубликовал ISO/IEC 21778:2017 [2] в качестве международного стандарта. 13 декабря 2017 года Инженерная группа Интернета упразднила RFC 7159, опубликовав RFC 8259, который является текущей версией Интернет-стандарта STD 90. [15] [16]
Крокфорд добавил в лицензию JSON пункт, в котором говорится, что «Программное обеспечение должно использоваться во благо, а не во зло», чтобы открыть исходный код библиотек JSON, высмеивая при этом корпоративных юристов и тех, кто чрезмерно педантичен. С другой стороны, этот пункт привел к проблемам совместимости лицензии JSON с другими лицензиями с открытым исходным кодом , поскольку программное обеспечение с открытым исходным кодом и свободное программное обеспечение обычно не предполагают никаких ограничений по цели использования. [17]
В следующем примере показано возможное представление JSON, описывающее человека.
{ "first_name" : "Джон" , "last_name" : "Смит" , "is_alive" : true , "возраст" : 27 , "адрес" : { "street_address" : "21 2nd Street" , "city" : "Новый Йорк" , "штат" : "Нью-Йорк" , "postal_code" : "10021-3100" }, "phone_numbers" : [ { "type" : "home" , "number" : "212 555-1234" }, { " тип" : "офис" , "номер" : "646 555-4567" } ], "дети" : [ "Кэтрин" , "Томас" , "Тревор" ], "супруга" : null }
Хотя Крокфорд первоначально утверждал, что JSON является строгим подмножеством JavaScript и ECMAScript, [18] его спецификация фактически допускает действительные документы JSON, которые не являются действительным JavaScript; JSON позволяет символам завершения строки Unicode U+2028 LINE SEPARATOR и U+2029 PARAGRAPH SEPARATOR отображаться в строках в кавычках без экранирования, в то время как ECMAScript 2018 и более ранние версии этого не делают. [19] [20] Это следствие того, что JSON запрещает использование только «управляющих символов». Для максимальной переносимости эти символы должны быть экранированы обратной косой чертой.
Обмен JSON в открытой экосистеме должен быть закодирован в UTF-8 . [8] Кодировка поддерживает полный набор символов Юникода, включая символы за пределами базовой многоязычной плоскости (от U+0000 до U+FFFF). Однако, если они экранированы, эти символы должны быть записаны с использованием суррогатных пар UTF-16 . Например, чтобы включить символ Emoji U+1F610 😐 НЕЙТРАЛЬНОЕ ЛИЦО в JSON:
{ "face" : "😐" } // или { "face" : "\uD83D\uDE10" }
JSON стал строгим подмножеством ECMAScript с версии языка 2019 года. [20] [21]
Основные типы данных JSON:
true
, либоfalse
null
: пустое значение, используя словоnull
Пробелы разрешены и игнорируются вокруг или между синтаксическими элементами (значениями и знаками препинания, но не внутри строкового значения). Для этой цели четыре конкретных символа считаются пробелами: пробел , горизонтальная табуляция , перевод строки и возврат каретки . В частности, знак порядка байтов не должен генерироваться соответствующей реализацией (хотя он может быть принят при анализе JSON). JSON не предоставляет синтаксис для комментариев . [24]
Ранние версии JSON (например, указанные в RFC 4627) требовали, чтобы действительный текст JSON состоял только из объекта или типа массива, который мог содержать внутри себя другие типы. Это ограничение было снято в RFC 7158, где текст JSON был переопределен как любое сериализованное значение.
Числа в JSON не зависят от их представления в языках программирования. Хотя это позволяет сериализовать числа произвольной точности , это может привести к проблемам с переносимостью. Например, поскольку между целочисленными значениями и значениями с плавающей запятой не проводится различие, некоторые реализации могут рассматривать 42
, 42.0
и 4.2E+1
как одно и то же число, а другие — нет. Стандарт JSON не предъявляет требований к деталям реализации, таким как переполнение , потеря точности, округление или нули со знаком , но он рекомендует ожидать не более точности, чем IEEE 754binary64 для «хорошей совместимости». При сериализации двоичного представления числа с плавающей запятой на машинном уровне (например,binary64) в удобочитаемое десятичное представление (например, числа в JSON) и обратно нет внутренней потери точности, поскольку существуют опубликованные алгоритмы, позволяющие сделать это именно так. и оптимально. [25]
Комментарии были намеренно исключены из JSON. В 2012 году Дуглас Крокфорд так описал свое дизайнерское решение: «Я удалил комментарии из JSON, потому что видел, что люди использовали их для хранения директив синтаксического анализа, а такая практика разрушила бы совместимость». [24]
JSON запрещает «конечные запятые» — запятую после последнего значения внутри структуры данных. [26] Завершающие запятые — обычная особенность производных JSON, предназначенная для упрощения использования. [27]
Хотя JSON обеспечивает синтаксическую структуру для обмена данными, однозначный обмен данными также требует соглашения между производителем и потребителем о семантике конкретного использования синтаксиса JSON. [28] Одним из примеров необходимости такого соглашения является сериализация типов данных, определенных синтаксисом JavaScript , которые не являются частью стандарта JSON, например, дата, функция, регулярное выражение и undefined
. [29]
RFC 8259 описывает определенные аспекты синтаксиса JSON, которые, хотя и являются законными согласно спецификациям, могут вызывать проблемы совместимости.
В 2015 году IETF опубликовал RFC7493, описывающий «Формат сообщения I-JSON», ограниченный профиль JSON, который ограничивает синтаксис и обработку JSON, чтобы избежать, насколько это возможно, этих проблем совместимости.
Официальным типом MIME для текста JSON является " application/json
", [30] , и большинство современных реализаций его приняли. Неофициальный тип MIME " " text/json
или тип контента " text/javascript
" также поддерживаются по устаревшим причинам многими поставщиками услуг, браузерами, серверами, веб-приложениями, библиотеками, платформами и API. Яркие примеры включают Google Search API, [31] Yahoo!, [31] [32] Flickr, [31] Facebook API, [33] Lift framework , [34] и Dojo Toolkit 0.4. [35]
Схема JSON определяет формат на основе JSON для определения структуры данных JSON для проверки, документирования и управления взаимодействием. Он предоставляет контракт для данных JSON, необходимых данному приложению, и способы изменения этих данных. [36] Схема JSON основана на концепциях XML-схемы (XSD), но основана на JSON. Как и в XSD, одни и те же инструменты сериализации/десериализации могут использоваться как для схемы, так и для данных, и они самоописываются. Это указано в интернет-проекте IETF, который в настоящее время находится в проекте 2020-12 годов, который был выпущен 28 января 2021 года. [37] Для разных языков программирования доступно несколько валидаторов, [38] каждый из которых имеет разные уровни соответствия. Стандартное расширение имени файла — .json. [39]
Стандарт JSON не поддерживает ссылки на объекты , но существует проект стандарта IETF для ссылок на объекты на основе JSON. [40]
JSON-RPC — это протокол удаленного вызова процедур (RPC), построенный на JSON в качестве замены XML-RPC или SOAP . Это простой протокол, определяющий лишь несколько типов данных и команд. JSON-RPC позволяет системе отправлять уведомления (информацию на сервер, не требующую ответа) и несколько вызовов на сервер, на которые можно отвечать вне очереди.
Асинхронный JavaScript и JSON (или AJAJ) относятся к той же методологии динамических веб-страниц , что и Ajax , но вместо XML форматом данных является JSON. AJAJ — это метод веб-разработки, который обеспечивает возможность веб-страницы запрашивать новые данные после ее загрузки в веб-браузер . Обычно он отображает новые данные с сервера в ответ на действия пользователя на этой веб-странице. Например, то, что пользователь вводит в поле поиска , код на стороне клиента затем отправляет на сервер, который немедленно отвечает раскрывающимся списком соответствующих элементов базы данных .
JSON используется в качестве языка конфигурации для особых случаев . Однако он не поддерживает комментарии . В 2012 году Дуглас Крокфорд, создатель JSON, сказал следующее о комментариях в JSON, когда они используются в качестве языка конфигурации: «Я знаю, что отсутствие комментариев расстраивает некоторых людей, но это не должно. Предположим, вы используете JSON, чтобы сохранить файлы конфигурации, которые вы хотели бы аннотировать. Вставьте все комментарии, которые вам нравятся. Затем пропустите их через JSMin [41] , прежде чем передать их вашему парсеру JSON". [24]
MongoDB использует данные в формате JSON для своей документо-ориентированной базы данных .
В некоторые реляционные базы данных, такие как PostgreSQL и MySQL, добавлена поддержка собственных типов данных JSON. Это позволяет разработчикам хранить данные JSON непосредственно в реляционной базе данных без необходимости конвертировать их в другой формат данных.
JSON, являющийся подмножеством JavaScript, может привести к неправильному представлению о том, что передавать тексты JSON в функцию JavaScript безопасно eval()
. Это небезопасно, поскольку некоторые допустимые тексты JSON, особенно те, которые содержат U+2028 LINE SEPARATOR или U+2029 PARAGRAPH SEPARATOR , не являются действительным кодом JavaScript до тех пор, пока спецификации JavaScript не будут обновлены в 2019 году, поэтому старые движки могут его не поддерживать. [42] Чтобы избежать множества ошибок, вызванных выполнением произвольного кода из Интернета, в пятое издание ECMAScript была впервые добавлена новая функция, [43] которая по состоянию на 2017 год поддерживается всеми основными браузерами. Для неподдерживаемых браузеров API-совместимая библиотека JavaScript предоставлена Дугласом Крокфордом . [44] Кроме того, предложение TC39 «Подключить JSON» сделало ECMAScript строгим расширенным набором JSON начиная с версии языка 2019 года. [20] [21]
Различные реализации парсера JSON пострадали от атак типа «отказ в обслуживании» и уязвимости массового присвоения . [45] [46] JSON.parse()
JSON пропагандируется как альтернатива XML с низкими издержками, поскольку оба этих формата широко поддерживают создание, чтение и декодирование в реальных ситуациях, где они обычно используются. [47] Помимо XML, примеры могут включать CSV и расширенные наборы JSON. Google Protocol Buffers может выполнить эту роль, хотя это не язык обмена данными. CBOR имеет расширенный набор типов данных JSON, но он не является текстовым.
XML использовался для описания структурированных данных и сериализации объектов. Существуют различные протоколы на основе XML для представления тех же структур данных, что и JSON, для тех же целей обмена данными. Данные могут быть закодированы в XML несколькими способами. Самая обширная форма с использованием пар тегов приводит к гораздо большему (по количеству символов) представлению, чем JSON, но если данные хранятся в атрибутах и форме «короткого тега», где закрывающий тег заменяется на />
, представление часто имеет примерно тот же размер. как JSON или немного больше. Однако атрибут XML может иметь только одно значение, и каждый атрибут может появляться не более одного раза в каждом элементе.
XML отделяет «данные» от «метаданных» (посредством использования элементов и атрибутов), тогда как JSON не имеет такой концепции.
Еще одним ключевым отличием является адресация ценностей. В JSON есть объекты с простым сопоставлением «ключ» и «значение», тогда как в XML адресация происходит на «узлах», каждый из которых получает уникальный идентификатор через процессор XML. Кроме того, стандарт XML определяет общий атрибут xml:id
, который может использоваться пользователем для явной установки идентификатора.
Имена тегов XML не могут содержать ни символов !"#$%&'()*+,/;<=>?@[\]^`{|}~
, ни пробелов, а также не могут начинаться с -
, .
или числовой цифры, тогда как ключи JSON могут (даже если необходимо экранировать кавычки и обратную косую черту). [48]
Значения XML представляют собой строки символов без встроенной безопасности типов . XML имеет концепцию схемы , которая допускает строгую типизацию, определяемые пользователем типы, предопределенные теги и формальную структуру, позволяющую формальную проверку потока XML. JSON имеет несколько встроенных типов и аналогичную концепцию схемы в JSON Schema.
XML поддерживает комментарии, а JSON — нет. [49] [24]
Поддержка комментариев и других функций была признана полезной, что привело к созданию нескольких нестандартных расширений JSON. Среди них HJSON, [50] HOCON и JSON5 (который, несмотря на свое название, не является пятой версией JSON). [51] [52]
YAML версии 1.2 представляет собой расширенный набор JSON; предыдущие версии не были строго совместимы. Например, экранирование косой черты /
обратной косой чертой \
допустимо в JSON, но недопустимо в YAML. [53] YAML поддерживает комментарии, а JSON — нет. [53] [51] [24]
CSON («нотация объекта рукописного сценария») определяется как крошечные грамматические дополнения к грамматике ABNF JSON , указанной в RFC 4627. Как и YAML, это строгий расширенный набор JSON. В отличие от YAML, любые данные CSON могут быть преобразованы в JSON туда и обратно, поэтому можно продолжать использовать библиотеку, которая понимает только JSON, и вам не нужно переводить существующий JSON. Помимо такой эквивалентности JSON, при проектировании учитывались следующие соображения: [54]
Существуют библиотеки для C, JavaScript, Python и Rust.
HOCON («Нотация объекта конфигурации, оптимизированная для человека» — это формат удобочитаемых данных и расширенный набор JSON. [55] HOCON используется следующим образом:
JSON5 («Формат обмена данными JSON5») — это расширение синтаксиса JSON, которое, как и JSON, также является допустимым синтаксисом JavaScript. Спецификация была начата в 2012 году и завершена в 2018 году версией 1.0.0. [66] Основные отличия от синтаксиса JSON:
Синтаксис JSON5 поддерживается в некоторых программах как расширение синтаксиса JSON, например, в SQLite . [67]
JSONC (JSON с комментариями) — это подмножество JSON5, которое в основном используется Microsoft:
//
) и блочные комментарии ( /* */
)Несколько форматов сериализации были созданы на основе спецификации JSON. Примеры включают в себя
{{cite journal}}
: Требуется цитировать журнал |journal=
( помощь )В 1996 году Macromedia запускает технологию Flash, которая занимает место, оставленное Java и ActiveX, и становится фактическим стандартом анимации на стороне клиента.
Он основан на подмножестве языка программирования JavaScript, стандарт ECMA-262, 3-е издание — декабрь 1999 г.
13 декабря 2017 г. [...] RFC опубликован.
Тип: RFC — Интернет-стандарт (декабрь 2017 г.; исправления); Устаревший RFC 7159; Также известен как STD 90.
JSON — это подмножество объектной литеральной записи JavaScript.
Синтаксис JSON не накладывает никаких ограничений на строки, используемые в качестве имен, не требует уникальности строк имен и не придает никакого значения порядку пар имя/значение.
Я удалил комментарии из JSON, потому что видел, что люди использовали их для хранения директив синтаксического анализа, а такая практика разрушила бы совместимость. Я знаю, что отсутствие комментариев расстраивает некоторых людей, но это не должно. Предположим, вы используете JSON для хранения файлов конфигурации, которые хотите аннотировать. Вставьте все комментарии, которые вам нравятся. Затем пропустите его через
JSMin
, прежде чем передать его парсеру JSON.
Синтаксис JSON не является спецификацией полного обмена данными. Для полноценного обмена данными требуется соглашение между производителем и потребителем о семантике, связанной с конкретным использованием синтаксиса JSON. Что JSON действительно предоставляет, так это синтаксическую структуру, к которой можно прикрепить такую семантику.
JSMin [2001] — это инструмент минимизации, который удаляет комментарии и ненужные пробелы из файлов JavaScript.
для представления данных вы можете выбрать один из следующих: YAML, YAMLEX, JSON, JSON5, HJSON или даже чистый Python.
Основная цель: сохранить семантику (древовидную структуру; набор типов; кодирование/экранирование) из JSON, но сделать его более удобным в качестве формата файла конфигурации, редактируемого человеком.