N/RFCNET
← Карточка документаEnglish original ↗

RFC 8259 · Декабрь 2017 · Заменяет RFC 7159

Формат обмена данными JavaScript Object Notation (JSON)

Internet Engineering Task Force (IETF)
Т. Брэй (T. Bray), редактор · Textuality
Категория: процесс стандартизации · ISSN: 2070-1721

Аннотация

JavaScript Object Notation (JSON) — компактный текстовый, независимый от языка программирования формат обмена данными. Он произошёл от стандарта языка программирования ECMAScript. JSON определяет небольшой набор правил оформления для переносимого представления структурированных данных.

Этот документ устраняет несогласованности с другими спецификациями JSON, исправляет ошибки спецификации и предлагает основанные на опыте рекомендации по совместимости.

Статус документа

Это документ процесса стандартизации Интернета.

Документ подготовлен Инженерным советом Интернета (IETF). Он отражает консенсус сообщества IETF, прошёл публичное обсуждение и одобрен к публикации Руководящей группой инженерных работ Интернета (IESG). Дополнительные сведения о стандартах Интернета приведены в разделе 2 RFC 7841.

Информация о текущем статусе документа, исправлениях и порядке отправки отзывов доступна по адресу rfc-editor.org/info/rfc8259.

Уведомление об авторских правах

Copyright (c) 2017 IETF Trust и лица, указанные в качестве авторов документа. Все права защищены.

На документ распространяются BCP 78 и Правовые положения IETF Trust, относящиеся к документам IETF (trustee.ietf.org/license-info), действовавшие на дату его публикации. Внимательно ознакомьтесь с ними: они определяют ваши права и ограничения в отношении этого документа. Компоненты кода, извлечённые из документа, должны включать текст Упрощённой лицензии BSD, как указано в разделе 4.e Правовых положений Trust, и предоставляются без гарантий согласно Упрощённой лицензии BSD.

Документ может содержать материалы из документов или вкладов IETF, опубликованных либо предоставленных для публичного доступа до 10 ноября 2008 года. Лица, обладающие авторскими правами на некоторые из этих материалов, могли не предоставить IETF Trust право разрешать изменения таких материалов вне процесса стандартизации IETF. Без получения надлежащего разрешения от обладателей авторских прав на такие материалы документ нельзя изменять вне процесса стандартизации IETF или создавать на его основе производные произведения вне этого процесса, кроме форматирования для публикации в качестве RFC или перевода на другие языки.

Содержание

1. Введение

JavaScript Object Notation (JSON) — текстовый формат сериализации структурированных данных. Он происходит от объектных литералов JavaScript, определённых в третьем издании стандарта языка программирования ECMAScript [ECMA-262].

JSON может представлять четыре примитивных типа — строки, числа, логические значения и null — и два структурированных типа: объекты и массивы.

Строка — последовательность из нуля или более символов Unicode [UNICODE]. Эта ссылка указывает на последнюю версию Unicode, а не на конкретный выпуск. Не ожидается, что будущие изменения спецификации Unicode повлияют на синтаксис JSON.

Объект — неупорядоченная коллекция из нуля или более пар «имя/значение», где имя является строкой, а значение — строкой, числом, логическим значением, null, объектом или массивом.

Массив — упорядоченная последовательность из нуля или более значений.

Термины «объект» и «массив» происходят из соглашений JavaScript.

Целями проектирования JSON были минимальность, переносимость, текстовое представление и принадлежность к подмножеству JavaScript.

1.1. Соглашения, используемые в документе

Ключевые слова «MUST», «MUST NOT», «REQUIRED», «SHALL», «SHALL NOT», «SHOULD», «SHOULD NOT», «RECOMMENDED», «NOT RECOMMENDED», «MAY» и «OPTIONAL» следует толковать согласно BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они написаны целиком прописными буквами, как показано здесь.

Грамматические правила настоящего документа следует толковать согласно [RFC5234].

1.2. Спецификации JSON

Настоящий документ заменяет [RFC7159]. [RFC7159] заменил [RFC4627], в котором JSON был описан первоначально и зарегистрирован медиатип «application/json».

JSON также описан в [ECMA-404].

Ссылка на ECMA-404 в предыдущем предложении нормативная. Это не означает обычного требования обратиться к ней для понимания документа; цель ссылки — подчеркнуть отсутствие несогласованностей в определении термина «текст JSON» во всех его спецификациях. Однако ECMA-404 допускает ряд практик, которых настоящая спецификация рекомендует избегать ради максимальной совместимости.

Предполагается, что грамматика в обоих документах одинакова, хотя описана разными способами. При обнаружении различия ECMA и IETF будут совместно обновлять оба документа.

Если в одном документе обнаружена ошибка, другой следует проверить на наличие аналогичной ошибки; при её наличии её следует по возможности исправить.

При изменении любого из документов в будущем ECMA и IETF будут совместно обеспечивать сохранение их согласованности.

1.3. Введение к этой редакции

За годы после публикации RFC 4627 JSON получил очень широкое применение. Этот опыт выявил некоторые способы использования, которые допускаются спецификациями, но приводят к проблемам совместимости.

Кроме того, сообщалось о небольшом количестве исправлений к RFC 4627 — RFC Errata ID 607 [Err607] и 3607 [Err3607] — и к RFC 7159: RFC Errata ID 3915 [Err3915], 4264 [Err4264], 4336 [Err4336] и 4388 [Err4388].

Цель документа — применить исправления, устранить несогласованности с другими спецификациями JSON и отметить практики, способные приводить к проблемам совместимости.

2. Грамматика JSON

Текст JSON — последовательность лексем. Набор лексем включает шесть структурных символов, строки, числа и три литеральных имени.

Текст JSON представляет собой сериализованное значение. Некоторые предыдущие спецификации ограничивали текст JSON объектом или массивом. Реализации, генерирующие только объекты или массивы там, где требуется текст JSON, будут совместимы в том смысле, что все реализации примут их как соответствующие спецификации тексты JSON.

Незначащие пробельные символы допускаются до и после любого из шести структурных символов.

3. Значения

Значение JSON ОБЯЗАНО (MUST) быть объектом, массивом, числом, строкой либо одним из следующих трёх литеральных имён:

false
null
true

Литеральные имена ОБЯЗАТЕЛЬНО (MUST) пишутся строчными буквами. Другие литеральные имена не допускаются.

4. Объекты

Объект представляется парой фигурных скобок, внутри которых находится ноль или более пар «имя/значение», также называемых членами объекта. Имя является строкой. После каждого имени следует одно двоеточие, отделяющее имя от значения. Одна запятая отделяет значение от следующего имени. Именам внутри объекта СЛЕДУЕТ (SHOULD) быть уникальными.

Объект с уникальными именами совместим в том смысле, что все принимающие его программные реализации одинаково определят соответствия имён и значений. Если имена не уникальны, поведение принимающего программного обеспечения непредсказуемо. Многие реализации возвращают только последнюю пару «имя/значение». Другие сообщают об ошибке либо не могут разобрать объект, а некоторые возвращают все пары, включая дубликаты.

Наблюдались различия между библиотеками разбора JSON в том, раскрывают ли они порядок членов объекта вызывающему программному обеспечению. Реализации, поведение которых от порядка членов не зависит, будут совместимы в том смысле, что эти различия на них не повлияют.

5. Массивы

Массив представляется квадратными скобками, окружающими ноль или более значений, также называемых элементами. Элементы разделяются запятыми.

Требования, чтобы значения в массиве были одного типа, нет.

6. Числа

Представление чисел аналогично используемому в большинстве языков программирования. Число представляется десятичными цифрами по основанию 10. Оно содержит целую часть, перед которой может стоять необязательный знак минус и за которой могут следовать дробная часть и/или экспонента. Ведущие нули не допускаются.

Дробная часть — десятичная точка, за которой следует одна или более цифр.

Экспонента начинается с буквы E в верхнем или нижнем регистре, за которой может следовать знак плюс или минус. После E и необязательного знака следует одна или более цифр.

Числовые значения, которые невозможно представить приведённой ниже грамматикой, например Infinity и NaN, не допускаются.

Спецификация разрешает реализациям ограничивать диапазон и точность принимаемых чисел. Поскольку программное обеспечение, реализующее числа IEEE 754 binary64 двойной точности [IEEE754], общедоступно и широко используется, хорошая совместимость достигается реализациями, не ожидающими большей точности или диапазона: они приближают числа JSON в пределах ожидаемой точности. Число JSON вида 1E400 или 3.141592653589793238462643383279 может указывать на возможные проблемы совместимости, поскольку предполагает, что создавшее его программное обеспечение ожидает от получателя большей величины и точности чисел, чем обычно доступно.

При использовании такого программного обеспечения целые числа в диапазоне [−(2**53)+1, (2**53)−1] совместимы в том смысле, что реализации точно совпадут в определении их числовых значений.

7. Строки

Представление строк аналогично соглашениям семейства языков C. Строка начинается и заканчивается кавычками. Между ними могут находиться любые символы Unicode, кроме символов, которые ОБЯЗАТЕЛЬНО (MUST) экранировать: кавычки, обратная косая черта и управляющие символы от U+0000 до U+001F.

Любой символ может быть экранирован. Если он находится в основной многоязычной плоскости (от U+0000 до U+FFFF), его можно представить шестисимвольной последовательностью: обратная косая черта, строчная буква u и четыре шестнадцатеричные цифры, кодирующие кодовую точку символа. Буквы A–F в шестнадцатеричной записи могут быть прописными или строчными. Например, строку из единственной обратной косой черты можно представить как "\u005C".

Для некоторых часто используемых символов также существуют двухсимвольные экранированные представления. Так, строку из единственной обратной косой черты можно записать короче: "\\".

Символ вне основной многоязычной плоскости экранируется последовательностью из 12 символов, кодирующей суррогатную пару UTF-16. Например, строку из единственного скрипичного ключа (U+1D11E) можно представить как "\uD834\uDD1E".

8. Вопросы строк и символов

8.1. Кодировка символов

Текст JSON, передаваемый между системами, не входящими в замкнутую экосистему, ОБЯЗАТЕЛЬНО (MUST) должен кодироваться в UTF-8 [RFC3629].

Предыдущие спецификации JSON не требовали UTF-8 при передаче текста JSON. Однако подавляющее большинство реализаций программного обеспечения на основе JSON выбрало UTF-8, так что это единственная кодировка, обеспечивающая совместимость.

Реализациям ЗАПРЕЩЕНО (MUST NOT) добавлять метку порядка байтов U+FEFF в начало передаваемого по сети текста JSON. Ради совместимости реализациям разбора JSON ДОПУСКАЕТСЯ (MAY) игнорировать присутствие такой метки вместо того, чтобы считать её ошибкой.

8.2. Символы Unicode

Если все строки текста JSON полностью состоят из символов Unicode [UNICODE], независимо от экранирования, текст JSON совместим: все разбирающие его программные реализации одинаково определят содержимое имён и строковых значений в объектах и массивах.

Однако ABNF этой спецификации допускает в именах членов и строковых значениях битовые последовательности, которые не кодируют символы Unicode, например "\uDEAD" — одиночный непарный суррогат UTF-16. Такое наблюдалось, например, когда библиотека обрезала строку UTF-16, не проверяя, не разделяется ли суррогатная пара. Поведение программного обеспечения, получающего тексты JSON с такими значениями, непредсказуемо: реализации, например, могут возвращать разную длину строкового значения или даже сталкиваться с фатальными исключениями во время выполнения.

8.3. Сравнение строк

Программным реализациям обычно требуется проверять имена членов объектов на равенство. Реализации, преобразующие текстовое представление в последовательности кодовых единиц Unicode и сравнивающие их численно, единицу за единицей, совместимы: во всех случаях они одинаково определяют равенство или неравенство двух строк. Например, при сравнении строк без преобразования экранированных символов реализации могут ошибочно считать "a\\b" и "a\u005Cb" неравными.

9. Анализаторы

Анализатор JSON преобразует текст JSON в другое представление. Анализатор JSON ОБЯЗАН (MUST) принимать все тексты, соответствующие грамматике JSON. Ему ДОПУСКАЕТСЯ (MAY) принимать формы и расширения, не являющиеся JSON.

Реализация может ограничивать размер принимаемых текстов, максимальную глубину вложенности, диапазон и точность чисел, а также длину и символьное содержимое строк.

10. Генераторы

Генератор JSON создаёт текст JSON. Результирующий текст ОБЯЗАН (MUST) строго соответствовать грамматике JSON.

11. Вопросы IANA

Медиатип текста JSON — application/json.

Имя типа
application
Имя подтипа
json
Обязательные параметры
Не применимо
Необязательные параметры
Не применимо
Кодирование
Двоичное (binary)
Безопасность
См. RFC 8259, раздел 12
Совместимость
Описана в RFC 8259
Опубликованная спецификация
RFC 8259

Приложения, использующие этот медиатип: JSON применялся для обмена данными между приложениями, написанными на всех следующих языках программирования: ActionScript, C, C#, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala и Scheme.

Магические числа
Не применимо
Расширения файлов
.json
Коды типов файлов Macintosh
TEXT
Контакт для дополнительной информации
IESG, <iesg@ietf.org>
Предполагаемое использование
COMMON — общее
Ограничения использования
Отсутствуют
Автор
Douglas Crockford, <douglas@crockford.com>
Орган управления изменениями
IESG, <iesg@ietf.org>

Примечание: параметр «charset» для этой регистрации не определён. Его добавление не влияет на соответствующих спецификации получателей.

12. Вопросы безопасности

Скриптовым языкам в целом присущи вопросы безопасности. JSON — подмножество JavaScript, исключающее присваивание и вызов.

Поскольку синтаксис JSON заимствован из JavaScript, для разбора большинства текстов JSON можно использовать функцию eval() этого языка, но не всех: некоторые символы, например U+2028 LINE SEPARATOR и U+2029 PARAGRAPH SEPARATOR, допустимы в JSON, но не в JavaScript. Обычно это создаёт неприемлемый риск безопасности: текст может содержать исполняемый код наряду с объявлениями данных. То же относится к функциям, подобным eval(), в любых других языках программирования, синтаксису которых соответствуют тексты JSON.

13. Примеры

Это объект JSON:

Его член Image — объект, у которого Thumbnail также является объектом, а IDs — массивом чисел.

Это массив JSON из двух объектов:

Ниже три небольших текста JSON, содержащих только значения:

"Hello world!"
42
true

14. Ссылки

Приложение A. Изменения относительно RFC 7159

В разделе перечислены изменения между настоящим документом и текстом RFC 7159.

Участники

RFC 4627 написал Douglas Crockford. Настоящий документ создан внесением относительно небольшого числа изменений в тот документ; поэтому подавляющее большинство текста принадлежит ему.

Адрес автора

Tim Bray (редактор)
Textuality
Email: tbray@textuality.com

Перевод: RFCNET · rfcnet.ru

Original copyright notice

Неофициальный перевод. При расхождениях см. оригинал.