RFC 4627 | Тип носителя «application/json» для обозначения объектов JavaScript (JSON)

RFC 4627 | Тип носителя «application/json» для обозначения объектов JavaScript (JSON)

Краткий обзор

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

 

Оглавление

1. Введение
1.1. Условные обозначения, используемые в этом документе
2. Грамматика JSON
2.1. Значения
2.2. Объекты
2.3. Массивы
2.4. Числа
2.5. Строки
3. Кодирование
4. Синтаксические анализаторы
5. Генераторы
6. Соображения IANA
7. Соображения безопасности
8. Примеры
9. Ссылки
9.1. Нормативные ссылки
Адрес автора
Благодарности

1. Введение

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

JSON может представлять:

  • четыре примитивных типа (строки, числа, логические значения и null)
  • два структурированных типа (объекты и массивы)

Строка (string) — это последовательность из нуля или более символов Unicode [UNICODE].

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

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

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

Целью дизайна JSON было сделать его минимальным, переносимым, текстовым и частью JavaScript.

1.1. Условные обозначения, используемые в этом документе

Ключевые слова «ОБЯЗАН — MUST», «НЕ ОБЯЗАН — MUST NOT», «ТРЕБУЕТСЯ — REQUIRED», «ДОЛЖЕН — SHALL», «НЕ ДОЛЖЕН — SHALL NOT», «СЛЕДУЕТ — SHOULD», «НЕ СЛЕДУЕТ — SHOULD NOT», «РЕКОМЕНДУЕТСЯ — RECOMMENDED», «НЕ РЕКОМЕНДУЕТСЯ — NOT RECOMMENDED», «ВОЗМОЖЕН — MAY» и «ДОПОЛНИТЕЛЬНО — OPTIONAL» в этом документе интерпретироваться как описано в [RFC2119 #] [RFC8174 #].

Грамматические правила в этом документе следует интерпретировать, как описано в [RFC4234 #].

 

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

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

Текст JSON — это сериализованный объект или массив.

JSON-text = object / array

Это шесть структурных символов:

begin-array     = ws %x5B ws ; [ левая квадратная скобка
begin-object    = ws %x7B ws ; { левая фигурная скобка
end-array       = ws %x5D ws ; ] правая квадратная скобка
end-object      = ws %x7D ws ; } правая фигурная скобка
name-separator  = ws %x3A ws ; : двоеточие
value-separator = ws %x2C ws ; , запятая

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

ws = *(
%x20 / ; Space - пробел
%x09 / ; Horizontal tab - Горизонтальная табуляция
%x0A / ; Line feed or New line - Перенос строки или Новая строка
%x0D ; Carriage return - Возврат каретки
)

2.1. Значения

Значение JSON ДОЛЖНО быть объектом, массивом, числом или строкой либо одним из следующих трех буквальных имен:

false null true

Имена букв должны быть написаны в нижнем регистре. Никакие другие имена букв не допускаются.

value = false / null / true / object / array / number / string
false = %x66.61.6c.73.65 ; false
null = %x6e.75.6c.6c ; null
true = %x74.72.75.65 ; true

2.2. Объекты

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

object = begin-object [ member *( value-separator member ) ] end-object
member = string name-separator value

2.3. Массивы

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

array = begin-array [ value *( value-separator value ) ] end-array

2.4. Числа

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

Восьмеричные и шестнадцатеричные формы не допускаются. Начальные нули не допускаются.

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

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

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

number        = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E ; .
digit1-9      = %x31-39 ; 1-9
e             = %x65 / %x45 ; e E
exp           = e [ minus / plus ] 1*DIGIT
frac          = decimal-point 1*DIGIT
int           = zero / ( digit1-9 *DIGIT )
minus         = %x2D ; -
plus          = %x2B ; +
zero          = %x30 ; 0

2.5. Строки

Представление строк похоже на соглашения, используемые в семействе языков программирования C. Строка начинается и заканчивается кавычками. Все символы Unicode могут быть помещены в кавычки, за исключением символов, которые должны быть экранированы: кавычки, обратная косая черта и управляющие символы (от U+0000 до U+001F).

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

В качестве альтернативы, есть двухсимвольные escape-представления некоторых популярных символов. Так, например, строка, содержащая только один символ обратного солидуса, может быть представлена более компактно как «\\».

Чтобы избежать расширенного символа, не относящегося к базовой многоязычной плоскости, символ представляется как последовательность из двенадцати символов, кодирующая суррогатную пару UTF-16. Так, например, строка, содержащая только символ ключа G (U+1D11E), может быть представлена как «\uD834\uDD1E».

string = quotation-mark *char quotation-mark
char = unescaped /
escape (
%x22 / ; " quotation mark U+0022
%x5C / ; \ reverse solidus U+005C
%x2F / ; / solidus U+002F
%x62 / ; b backspace U+0008
%x66 / ; f form feed U+000C
%x6E / ; n line feed U+000A
%x72 / ; r carriage return U+000D
%x74 / ; t tab U+0009
%x75 4HEXDIG ) ; uXXXX U+XXXX
escape = %x5C ; \
quotation-mark = %x22 ; "
unescaped = %x20-21 / %x23-5B / %x5D-10FFFF

3. Кодирование

Текст JSON ДОЛЖЕН быть закодирован в Unicode. Кодировка по умолчанию — UTF-8.

Поскольку первые два символа текста JSON всегда будут символами ASCII [RFC0020 #], можно определить, является ли поток октетов UTF-8, UTF-16 (BE или LE) или UTF-32 (BE или LE). взглянув на образец нулей в первых четырех октетах.

00 00 00 xx UTF-32BE
00 xx 00 xx UTF-16BE
xx 00 00 00 UTF-32LE
xx 00 xx 00 UTF-16LE
xx xx xx xx UTF-8

 

4. Синтаксические анализаторы

Парсер (синтаксический анализатор) JSON преобразует текст JSON в другое представление. Парсер JSON ДОЛЖЕН принимать все тексты, соответствующие грамматике JSON. Парсер JSON МОЖЕТ принимать формы или расширения, отличные от JSON.

Реализация может:

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

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

Генератор JSON создает текст JSON. Полученный текст ДОЛЖЕН строго соответствовать грамматике JSON.

6. Соображения IANA

Тип мультимедиа MIME для текста JSON: application/json.

Название типа: application

Имя подтипа: json

Обязательные параметры: н / д

Необязательные параметры: н / д

Рекомендации по кодированию: 8 бит, если UTF-8; двоичный, если UTF-16 или UTF-32

JSON может быть представлен с использованием UTF-8, UTF-16 или UTF-32. Когда JSON написан в UTF-8, JSON совместим с 8 битами. Когда JSON записывается в UTF-16 или UTF-32, необходимо использовать двоичную кодировку передачи содержимого.

Соображения по совместимости: н / д

Опубликованная спецификация: RFC 4627 (эта спецификация)

Приложения, использующие этот тип носителя:

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

Дополнительная информация:

Магическое число (а): н / д
Расширение файла (-ей): .json
Код (ы) типа файлов для Macintosh: TEXT

Лицо и адрес электронной почты, с которыми можно связаться для получения дополнительной информации:

Douglas Crockford — douglas@crockford.com

Предполагаемое использование: COMMON (ОБЩЕЕ)

Ограничения на использование: нет

 

7. Соображения безопасности

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

Текст JSON можно безопасно передать в функцию JavaScript eval() (которая компилирует и выполняет строку), если все символы, не заключенные в строки, входят в набор символов, образующих токены JSON. Это можно быстро определить в JavaScript с помощью двух регулярных выражений и вызовов методов test и replace.

var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ’’))) &&
eval(’(’ + text + ’)’);

8. Примеры

Это объект JSON:

{
"Image": {
"Width": 800,
"Height": 600,
"Title": "View from 15th Floor",
"Thumbnail": {
"Url": "http://www.example.com/image/481989943",
"Height": 125,
"Width": "100"
},
"IDs": [116, 943, 234, 38793]
}
}

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

Это массив JSON, содержащий два объекта:

[
{
"precision": "zip",
"Latitude": 37.7668,
"Longitude": -122.3959,
"Address": "",
"City": "SAN FRANCISCO",
"State": "CA",
"Zip": "94107",
"Country": "US"
},
{
"precision": "zip",
"Latitude": 37.371991,
"Longitude": -122.026020,
"Address": "",
"City": "SUNNYVALE",
"State": "CA",
"Zip": "94085",
"Country": "US"
}
]

 

9. Ссылки

9.1. Нормативные ссылки

[ECMA] European Computer Manufacturers Association, «ECMAScript Language Specification 3rd Edition», December 1999,

http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf

[RFC0020] Cerf, V., «ASCII format for network interchange», RFC 20, October 1969.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC4234] Crocker, D. and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», RFC 4234, October 2005.

[UNICODE] The Unicode Consortium, «The Unicode Standard Version 4.0», 2003,

http://www.unicode.org/versions/Unicode4.1.0/

Адрес автора

ФИО: Douglas Crockford

САЙТ: JSON.org

Электронная почта: douglas@crockford.com

Благодарности

Финансирование функции редактора RFC обеспечивается отделом административной поддержки IETF (IASA).

Дата публикации оригинального документа

Июль 2006 года