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» [a] , похоже, стало более распространенным в техническом сообществе». [5] Крокфорд сказал в 2011 году: «Есть много споров о том, как это произносить, но мне, строго говоря, все равно». [1]
После того, как RFC 4627 был доступен в качестве «информационной» спецификации с 2006 года, JSON был впервые стандартизирован в 2013 году как ECMA -404. [4] RFC 8259, опубликованный в 2017 году, является текущей версией интернет-стандарта STD 90, и он по-прежнему соответствует ECMA-404. [6] В том же году JSON был также стандартизирован как ISO / IEC 21778:2017. [2] Стандарты ECMA и ISO / IEC описывают только разрешенный синтаксис, тогда как RFC охватывает некоторые вопросы безопасности и совместимости. [7]
JSON возник из-за необходимости в протоколе сеансовой связи сервера с браузером в режиме реального времени без использования плагинов браузера, таких как Flash или Java -апплеты, которые были основными методами, использовавшимися в начале 2000-х годов. [8]
Crockford первым определил и популяризировал формат JSON. [1] Аббревиатура возникла в State Software, компании, соучредителем которой был Crockford и другие в марте 2001 года. Соучредители договорились о создании системы, которая использовала бы стандартные возможности браузера и предоставляла бы уровень абстракции для веб-разработчиков для создания веб-приложений с сохранением состояния, которые имели бы постоянное дуплексное соединение с веб-сервером, удерживая открытыми два соединения по протоколу передачи гипертекста (HTTP) и перезапуская их до истечения стандартного времени ожидания браузера, если дальнейший обмен данными не производился. Соучредители провели обсуждение за круглым столом и проголосовали за то, называть ли формат данных JSML (язык разметки JavaScript) или JSON (нотация объектов JavaScript), а также под каким типом лицензии сделать его доступным. Сайт JSON.org [9] был запущен в 2001 году. В декабре 2005 года Yahoo! начала предлагать некоторые из своих веб-сервисов в формате JSON. [10]
Предшественник библиотек JSON использовался в детском проекте игры по торговле цифровыми активами Cartoon Orbit на сайте Communities.com [ требуется ссылка ] (все соучредители State ранее работали в этой компании) для Cartoon Network [ требуется ссылка ] , который использовал подключаемый модуль на стороне браузера с фирменным форматом сообщений для манипулирования элементами DHTML (эта система также принадлежит 3DO [ требуется ссылка ] ). После открытия ранних возможностей Ajax digiGroups, Noosh и другие использовали фреймы для передачи информации в поле зрения браузера пользователя без обновления визуального контекста веб-приложения, реализуя насыщенные веб-приложения в реальном времени, используя только стандартные возможности HTTP, HTML и JavaScript Netscape 4.0.5+ и Internet Explorer 5+. Затем Крокфорд обнаружил, что JavaScript можно использовать в качестве объектно-ориентированного формата сообщений для такой системы. Система была продана Sun Microsystems , Amazon.com и EDS .
JSON был основан на подмножестве языка сценариев JavaScript (в частности, Standard ECMA -262 3rd Edition—December 1999 [11] ) и обычно используется с JavaScript, но это независимый от языка формат данных. Код для анализа и генерации данных JSON легко доступен во многих языках программирования . На веб-сайте JSON перечислены библиотеки JSON по языкам.
В октябре 2013 года Ecma International опубликовала первую редакцию своего стандарта JSON ECMA-404. [4] В том же году 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 года Internet Engineering Task Force объявила RFC 7159 устаревшим , опубликовав RFC 8259, который является текущей версией интернет- стандарта STD 90. [12] [13]
Крокфорд добавил пункт в лицензию JSON, гласящий: «Программное обеспечение должно использоваться во благо, а не во зло», чтобы открыть исходный код библиотек JSON, высмеивая корпоративных юристов и тех, кто излишне педантичен. С другой стороны, этот пункт привел к проблемам совместимости лицензий JSON с другими лицензиями с открытым исходным кодом, поскольку программное обеспечение с открытым исходным кодом и бесплатное программное обеспечение обычно не подразумевают никаких ограничений на цель использования. [14]
В следующем примере показано возможное представление JSON, описывающее человека.
{ "first_name" : "John" , "last_name" : "Smith" , "is_alive" : true , "age" : 27 , "address" : { "street_address" : "21 2nd Street" , "city" : "New York" , "state" : "NY" , "postal_code" : "10021-3100" }, "phone_numbers" : [ { "type" : "home" , "number" : "212 555-1234" }, { "type" : "office" , "number" : "646 555-4567" } ], "children" : [ "Catherine" , "Thomas" , "Trevor" ], "spouse" : null }
Хотя изначально Крокфорд утверждал, что JSON является строгим подмножеством JavaScript и ECMAScript , [15] его спецификация фактически допускает допустимые документы JSON, которые не являются допустимыми JavaScript; JSON допускает, чтобы символы конца строки Unicode U+2028 LINE SEPARATOR и U+2029 PARAGRAPH SEPARATOR отображались неэкранированными в строках в кавычках, в то время как ECMAScript 2018 и более ранние версии этого не делают. [16] [17] Это следствие того, что JSON запрещает только «управляющие символы». Для максимальной переносимости эти символы должны быть экранированы обратной косой чертой.
Обмен JSON в открытой экосистеме должен быть закодирован в UTF-8 . [6] Кодировка поддерживает полный набор символов Unicode, включая символы за пределами базовой многоязыковой плоскости (от U+0000 до U+FFFF). Однако, если экранированы, эти символы должны быть записаны с использованием суррогатных пар UTF-16 . Например, чтобы включить символ эмодзи U+1F610 😐 НЕЙТРАЛЬНОЕ ЛИЦО в JSON:
{ "лицо" : "😐" } // или { "лицо" : "\uD83D\uDE10" }
JSON стал строгим подмножеством ECMAScript с момента пересмотра языка в 2019 году. [17] [18]
Основные типы данных JSON:
true
илиfalse
null
: пустое значение, использующее словоnull
Пробелы разрешены и игнорируются вокруг или между синтаксическими элементами (значениями и знаками препинания, но не внутри строкового значения). Четыре определенных символа считаются пробелами для этой цели: пробел , горизонтальная табуляция , перевод строки и возврат каретки . В частности, метка порядка байтов не должна генерироваться соответствующей реализацией (хотя она может быть принята при разборе JSON). JSON не предоставляет синтаксис для комментариев . [21]
Ранние версии JSON (например, указанные в RFC 4627) требовали, чтобы допустимый текст JSON состоял только из объекта или типа массива, которые могли содержать другие типы внутри себя. Это ограничение было снято в RFC 7158, где текст JSON был переопределен как любое сериализованное значение.
Числа в JSON не зависят от их представления в языках программирования. Хотя это позволяет сериализовать числа произвольной точности42
, это может привести к проблемам переносимости. Например, поскольку не делается различий между целыми и плавающими значениями, некоторые реализации могут рассматривать , 42.0
и 4.2E+1
как одно и то же число, в то время как другие — нет. Стандарт JSON не предъявляет требований к деталям реализации, таким как переполнение , подзарядка , потеря точности, округление или нули со знаком , но рекомендует ожидать не более точности IEEE 754 binary64 для «хорошей совместимости». Нет никакой неотъемлемой потери точности при сериализации двоичного представления числа с плавающей точкой на уровне машины (например, binary64) в понятное человеку десятичное представление (например, числа в JSON) и обратно, поскольку существуют опубликованные алгоритмы, позволяющие сделать это точно и оптимально. [22]
Комментарии были намеренно исключены из JSON. В 2012 году Дуглас Крокфорд описал свое решение по дизайну следующим образом: «Я удалил комментарии из JSON, потому что увидел, что люди используют их для хранения директив синтаксического анализа, практика, которая разрушила бы взаимодействие». [21]
JSON запрещает «завершающие запятые», запятую после последнего значения внутри структуры данных. [23] Завершающие запятые являются общей чертой производных JSON для повышения удобства использования. [24]
RFC 8259 описывает некоторые аспекты синтаксиса JSON, которые, хотя и являются допустимыми согласно спецификациям, могут вызывать проблемы с совместимостью.
В 2015 году IETF опубликовала RFC 7493, описывающий «Формат сообщения I-JSON» — ограниченный профиль JSON, который ограничивает синтаксис и обработку JSON, чтобы избежать, насколько это возможно, этих проблем взаимодействия.
Хотя JSON предоставляет синтаксическую структуру для обмена данными, однозначный обмен данными также требует соглашения между производителем и потребителем о семантике конкретного использования синтаксиса JSON. [25] Одним из примеров, когда такое соглашение необходимо, является сериализация типов данных, которые не являются частью стандарта JSON, например, даты и регулярные выражения .
Официальный тип MIME для текста JSON — application/json
, [26] и большинство современных реализаций приняли его. Устаревшие типы MIME включают text/json
, text/x-json
, и text/javascript
. [27]
JSON Schema определяет формат на основе JSON для определения структуры данных JSON для проверки, документирования и управления взаимодействием. Он предоставляет контракт для данных JSON, требуемых данным приложением, и того, как эти данные могут быть изменены. [28] JSON Schema основана на концепциях из XML Schema (XSD), но основана на JSON. Как и в XSD, одни и те же инструменты сериализации/десериализации могут использоваться как для схемы, так и для данных, и она самоописываемая. Она указана в интернет-проекте в IETF, причем последняя версия по состоянию на 2024 год — «Проект 2020-12». [29] Существует несколько валидаторов, доступных для разных языков программирования, [30] каждый из которых имеет разные уровни соответствия. Стандартное расширение имени файла — .json. [31]
Стандарт JSON не поддерживает ссылки на объекты , но существует проект стандарта IETF для ссылок на объекты на основе JSON. [32]
JSON-RPC — это протокол удаленного вызова процедур (RPC), созданный на основе JSON, как замена XML-RPC или SOAP . Это простой протокол, который определяет лишь несколько типов данных и команд. JSON-RPC позволяет системе отправлять уведомления (информацию на сервер, которая не требует ответа) и несколько вызовов на сервер, на которые можно отвечать вне очереди.
Асинхронный JavaScript и JSON (или AJAJ) относится к той же динамической методологии веб-страниц, что и Ajax , но вместо XML форматом данных является JSON. AJAJ — это метод веб-разработки, который обеспечивает возможность веб- страницы запрашивать новые данные после ее загрузки в веб-браузер . Обычно он отображает новые данные с сервера в ответ на действия пользователя на этой веб-странице. Например, то, что пользователь вводит в поле поиска , клиентский код затем отправляет на сервер, который немедленно отвечает раскрывающимся списком соответствующих элементов базы данных .
JSON использовался ad hoc в качестве языка конфигурации . Однако он не поддерживает комментарии . В 2012 году Дуглас Крокфорд, создатель JSON, сказал следующее о комментариях в JSON при использовании в качестве языка конфигурации: «Я знаю, что отсутствие комментариев огорчает некоторых людей, но это не так. Предположим, вы используете JSON для хранения файлов конфигурации, которые вы хотели бы аннотировать. Продолжайте и вставляйте все комментарии, которые вам нужны. Затем передайте их через JSMin [33] перед передачей вашему парсеру JSON». [21]
MongoDB использует данные в формате JSON для своей документоориентированной базы данных .
Некоторые реляционные базы данных, такие как PostgreSQL и MySQL, добавили поддержку собственных типов данных JSON. Это позволяет разработчикам хранить данные JSON непосредственно в реляционной базе данных без необходимости конвертировать их в другой формат данных.
JSON, являющийся подмножеством JavaScript, может привести к неправильному представлению о том, что безопасно передавать тексты JSON в eval()
функцию JavaScript. Это небезопасно, поскольку некоторые допустимые тексты JSON, в частности те, которые содержат U+2028 LINE SEPARATOR или U+2029 PARAGRAPH SEPARATOR , не были допустимым кодом JavaScript до тех пор, пока спецификации JavaScript не были обновлены в 2019 году, и поэтому старые движки могут не поддерживать его. [34] Чтобы избежать множества ловушек, вызванных выполнением произвольного кода из Интернета, в пятое издание ECMAScript была впервые добавлена новая функция, [35], которая с 2017 года поддерживается всеми основными браузерами. Для неподдерживаемых браузеров Дуглас Крокфорд предоставляет совместимую с API библиотеку JavaScript . [36] Кроме того, предложение TC39 «Подчинить JSON» сделало ECMAScript строгим надмножеством JSON с версии языка 2019 года. [17] [18] Различные реализации парсера JSON пострадали от атак типа «отказ в обслуживании» и уязвимости массового назначения . [37] [38] JSON.parse()
JSON продвигается как малозатратная альтернатива XML, поскольку оба эти формата имеют широкую поддержку для создания, чтения и декодирования в реальных ситуациях, где они обычно используются. [39] Помимо XML, примерами могут служить CSV и надмножества JSON. Google Protocol Buffers может выполнять эту роль, хотя это не язык обмена данными. CBOR имеет надмножество типов данных JSON, но он не основан на тексте. Ion также является надмножеством JSON с более широким диапазоном основных типов, аннотаций, комментариев и допускает замыкающие запятые. [40]
XML использовался для описания структурированных данных и сериализации объектов. Существуют различные протоколы на основе XML для представления тех же типов структур данных, что и JSON, для тех же целей обмена данными. Данные могут быть закодированы в XML несколькими способами. Самая расширенная форма с использованием пар тегов приводит к гораздо большему (по количеству символов) представлению, чем JSON, но если данные хранятся в атрибутах и форме «короткого тега», где закрывающий тег заменен на />
, представление часто имеет примерно такой же размер, как JSON, или немного больше. Однако атрибут XML может иметь только одно значение, и каждый атрибут может появляться не более одного раза в каждом элементе.
XML разделяет «данные» и «метаданные» (посредством использования элементов и атрибутов), тогда как JSON не имеет такой концепции.
Другим ключевым отличием является адресация значений. JSON имеет объекты с простым отображением "ключа" на "значение", тогда как в XML адресация происходит на "узлах", которые все получают уникальный идентификатор через процессор XML. Кроме того, стандарт XML определяет общий атрибут xml:id
, который может использоваться пользователем для явной установки идентификатора.
Имена тегов XML не могут содержать ни один из символов !"#$%&'()*+,/;<=>?@[\]^`{|}~
, ни пробел, и не могут начинаться с -
, .
или цифры, тогда как ключи JSON могут (даже если кавычки и обратная косая черта должны быть экранированы). [41]
Значения XML представляют собой строки символов без встроенной безопасности типов . XML имеет концепцию схемы , которая допускает строгую типизацию, определяемые пользователем типы, предопределенные теги и формальную структуру, что позволяет проводить формальную проверку потока XML. JSON имеет несколько встроенных типов и имеет похожую концепцию схемы в JSON Schema.
XML поддерживает комментарии, а JSON — нет. [42] [21]
Поддержка комментариев и других функций была признана полезной, что привело к созданию нескольких нестандартных надмножеств JSON. Среди них HJSON, [43] HOCON и JSON5 (который, несмотря на свое название, не является пятой версией JSON). [44] [45]
YAML версии 1.2 является надмножеством JSON; предыдущие версии не были строго совместимы. Например, экранирование слеша /
с помощью обратного слеша \
допустимо в JSON, но недопустимо в YAML. [46] YAML поддерживает комментарии, а JSON — нет. [46] [44] [21]
CSON (" CoffeeScript Object Notation ") использует значительные отступы , ключи без кавычек и предполагает внешнее объявление объекта. Он использовался для настройки текстового редактора Atom на GitHub . [47] [48] [49]
Существует также не связанный с этим проект под названием CSON («Cursive Script Object Notation»), который синтаксически более похож на JSON. [50]
HOCON («Human-Optimized Config Object Notation») — это формат для данных , читаемых человеком , и надмножество JSON. [51] HOCON используется в следующих случаях:
JSON5 («Формат обмена данными JSON5») — это расширение синтаксиса JSON, которое, как и JSON, также является допустимым синтаксисом JavaScript. Спецификация была начата в 2012 году и завершена в 2018 году с версией 1.0.0. [62] Основные отличия от синтаксиса JSON:
Синтаксис JSON5 поддерживается в некотором программном обеспечении как расширение синтаксиса JSON, например в SQLite . [63]
JSONC (JSON с комментариями) — это подмножество JSON5, используемое в коде Visual Studio от Microsoft : [64]
//
) и блочные комментарии ( /* */
)Несколько форматов сериализации были построены на основе спецификации JSON. Примеры включают
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь )В 1996 году Macromedia запускает технологию Flash, которая занимает место, оставленное Java и ActiveX, становясь фактическим стандартом для анимации на стороне клиента.
основан на подмножестве языка программирования JavaScript, стандарта ECMA-262 3-го издания — декабрь 1999 г.
2017-12-13 [...] RFC опубликован
Тип: RFC - Internet Standard (декабрь 2017 г.; Errata); Устаревший RFC 7159; Также известен как STD 90
— это подмножество объектной литеральной нотации JavaScript.
удалил комментарии из JSON, потому что увидел, что люди используют их для хранения директив синтаксического анализа, практика, которая могла бы разрушить взаимодействие. Я знаю, что отсутствие комментариев огорчает некоторых людей, но это не должно огорчать. Предположим, вы используете JSON для хранения файлов конфигурации, которые вы хотели бы аннотировать. Продолжайте и вставляйте все комментарии, которые вам нравятся. Затем передайте их через
JSMin,
прежде чем передать вашему парсеру JSON.
JSMin [2001] — это инструмент минификации, который удаляет комментарии и ненужные пробелы из файлов JavaScript.
Для представления данных можно выбрать один из следующих вариантов: YAML, YAMLEX, JSON, JSON5, HJSON или даже чистый Python.
цель: сохранить семантику (древовидную структуру; набор типов; кодирование/экранирование) из JSON, но сделать его более удобным в качестве формата файла конфигурации, доступного для редактирования человеком.