Что такое JSON? Полное руководство для начинающих
Всё о JSON — формате данных современного веба: от синтаксиса до использования в API.
JSON за 30 секунд
JSON (JavaScript Object Notation) — это легкий текстовый формат данных, который стал лингва франка для обмена данными в интернете. Если вы когда-либо вызывали REST API, открывали файл package.json или работали с MongoDB, вы уже использовали JSON — вероятно, не задумываясь об этом.
В своей основе JSON — это просто способ представления структурированных данных в виде простого текста. Он читаем человеком (в основном), легко разбирается машиной и поддерживается практически каждым языком программирования. Именно это сочетание и сделало его победителем.
Краткая история
JSON был популяризирован Дугласом Крокфордом в начале 2000-х. Он не "изобрел" его — синтаксис является подмножеством JavaScript, который существует с 1999 года — но он дал ему имя, веб-сайт (json.org) и спецификацию. Иногда брендинг важнее изобретения.
Формат был официально специфицирован в RFC 4627 (2006) и позже заменен RFC 8259 (2017) и стандартом ECMA-404. Но, честно говоря, спецификация с тех пор не изменилась. Простота JSON — это его величайшая сила — здесь просто нет много чего менять.
Перед тем как JSON стал доминировать, XML был основным форматом обмена данными. Если вы хотите увидеть, почему разработчики устремились к JSON, ознакомьтесь с нашим сравнением JSON и XML.
6 типов данных JSON
JSON поддерживает ровно шесть типов данных. Ни больше, ни меньше. Это ограничение намеренно — оно сохраняет простоту и совместимость между языками.
| Тип | Описание | Пример |
|---|---|---|
| Строка | Текст, заключенный в двойные кавычки | "hello world" |
| Число | Целое или число с плавающей точкой (без шестнадцатичных, NaN, бесконечности) | 42, 3.14, -7 |
| Булевый | Литералы true или false | true |
| Null | Представляет пустое или неизвестное значение | null |
| Объект | Неупорядоченная коллекция пар "ключ-значение" | {"name": "Ada"} |
| Массив | Упорядоченный список значений | [1, 2, 3] |
Обратите внимание, что в списке нет дат, функций, неопределенных значений, комментариев или двоичных данных. JSON не поддерживает ни одно из этих значений на нативном уровне. Даты обычно передаются в виде строк ISO 8601 ("2025-01-15T10:30:00Z"), а двоичные данные кодируются в Base64. Это немного раздражает, но делает формат универсальным.
Правила синтаксиса JSON
Синтаксис JSON строгий. Если вы пришли из JavaScript, вы можете споткнуться о некоторые из этих правил. Вот они, без прикрас:
- Ключи должны быть строками в двойных кавычках. Одинарные кавычки не работают. Некомментированные ключи не работают. Это не JavaScript.
- Строки должны использовать двойные кавычки.
'hello'— это недопустимый JSON."hello"— допустимый. - Нет завершающих запятых. Последняя запятая после последнего свойства? JSON говорит "нет".
- Нет комментариев. Это, вероятно, самое спорное дизайнерское решение JSON. Дуглас Крокфорд намеренно убрал их, чтобы предотвратить злоупотребления.
- Нет корня с единственным значением (в старых спецификациях). RFC 8259 теперь позволяет любое значение JSON в качестве корня, но многие парсеры все еще ожидают объект или массив.
Вот допустимый документ JSON:
{
"name": "Grace Hopper",
"age": 85,
"languages": ["COBOL", "FORTRAN"],
"retired": true,
"spouse": null,
"address": {
"city": "Arlington",
"state": "VA"
}
}
А вот что его ломает:
{
name: "Grace Hopper", // ❌ Некомментированный ключ
'age': 85, // ❌ Ключ в одинарных кавычках
"languages": ["COBOL",], // ❌ Завершающая запятая
// Это комментарий // ❌ Комментарии не допускаются
}
У вас есть недопустимый JSON? Вставьте его в наш JSON Formatter, чтобы мгновенно обнаружить синтаксические ошибки и автоматически исправить распространенные проблемы, такие как завершающие запятые.
JSON против объектов JavaScript
Это сбивает с толку почти каждого разработчика JavaScript в какой-то момент. JSON выглядит как литерал объекта JS, но это не одно и то же. Вот где они расходятся:
| Особенность | JSON | Объект JavaScript |
|---|---|---|
| Ключи | Должны быть строками в двойных кавычках | Могут быть некомментированными идентификаторами, символами или вычисленными |
| Строки | Только двойные кавычки | Одинарные кавычки, двойные кавычки или обратные кавычки |
| Завершающие запятые | Не допускаются | Допускаются |
| Комментарии | Не допускаются | Допускаются |
| Значения | Строки, числа, булевы, null, объекты, массивы | Все вышеперечисленное плюс функции, неопределенные значения, Date, RegExp и т. д. |
| Методы | Не поддерживаются | Поддерживаются |
| Использование | Формат обмена данными (текст) | Структура данных в памяти |
На практике вы конвертируете между ними с помощью JSON.parse() и JSON.stringify():
// Строка → Объект
const data = JSON.parse('{"name": "Ada", "year": 1843}');
console.log(data.name); // "Ada"
// Объект → Строка
const json = JSON.stringify({ name: "Ada", year: 1843 });
console.log(json); // '{"name":"Ada","year":1843}'
// Красивый вывод с отступами в 2 пробела
const pretty = JSON.stringify(data, null, 2);
Распространенные случаи использования
1. REST API
Это основа JSON. Большинство современных веб-API отправляют и принимают JSON. Когда вы fetch() данные с сервера, вы почти наверняка получаете JSON в ответ:
const response = await fetch("https://api.example.com/users/1");
const user = await response.json();
// { "id": 1, "name": "Alice", "email": "alice@example.com" }
2. Файлы конфигурации
package.json, tsconfig.json, .eslintrc.json, composer.json — список можно продолжать. JSON повсюду в инструментах для разработчиков. Отсутствие комментариев здесь действительно болезненно, поэтому некоторые инструменты поддерживают JSON5 или JSONC (JSON с комментариями) в качестве альтернатив.
3. NoSQL базы данных
MongoDB хранит документы в формате BSON (Binary JSON). CouchDB использует простой JSON. DynamoDB, Firestore и множество других используют структуры, похожие на JSON. Если вы работаете с документной базой данных, вы работаете с JSON.
4. Локальное хранилище и управление состоянием
Браузерное localStorage хранит только строки, поэтому сериализация состояния в JSON является стандартным подходом:
// Сохранить
localStorage.setItem("prefs", JSON.stringify({ theme: "dark", lang: "en" }));
// Загрузить
const prefs = JSON.parse(localStorage.getItem("prefs") ?? "{}");
5. Обмен данными между микросервисами
Очереди сообщений (RabbitMQ, Kafka), вебхуки и межсервисное взаимодействие сильно зависят от JSON. Это не всегда самый эффективный выбор для сценариев с высокой пропускной способностью (Protobuf и MessagePack быстрее), но это самый удобный для отладки вариант.
Лучшие практики JSON
После многих лет работы с JSON каждый день, вот привычки, которые я рекомендую развивать:
- Используйте последовательные соглашения об именовании. Выберите
camelCaseилиsnake_caseдля ключей и придерживайтесь этого в вашем API. Смешивание их — это быстрый путь к ошибкам. - Проверяйте на раннем этапе. Не доверяйте входящему JSON безоговорочно. Используйте JSON Schema validation, чтобы поймать неправильно сформированные данные до того, как они попадут в вашу бизнес-логику.
- Держите вложенность мелкой. Если ваш JSON имеет более 3–4 уровней вложенности, подумайте о его упрощении. Глубоко вложенные структуры трудно запрашивать, трудно читать и трудно сравнивать.
- Используйте массивы для списков, объекты для записей. Звучит очевидно, но я видел, как люди используют объекты с числовыми строковыми ключами (
{"0": "a", "1": "b"}) вместо массивов. Не делайте этого. - Предпочитайте
nullотсутствующим ключам, когда поле не имеет значения. Это делает схему явной и избегает неоднозначности относительно того, было ли поле намеренно пропущено. - Форматируйте для людей во время разработки. Минифицированный JSON экономит байты, но убивает читаемость. Используйте красивый вывод при отладке, минифицируйте при отправке. Наш JSON Minifier справляется с последним.
Попробуйте сами: Вставьте любой JSON в наш JSON Formatter, чтобы мгновенно проверить, отформатировать и исследовать его структуру с подсветкой синтаксиса и древовидным представлением.
Что насчет JSON5 и JSONC?
Если строгость JSON вас беспокоит, вы не одиноки. Два популярных расширения ослабляют правила:
- JSON5 позволяет использовать строки в одинарных кавычках, завершающие запятые, комментарии, некомментированные ключи и многое другое. Это отлично подходит для конфигурационных файлов, где основная аудитория — люди.
- JSONC (JSON с комментариями) — минимальное расширение, используемое в конфигурациях VS Code и TypeScript. Оно добавляет только поддержку комментариев — ничего больше.
Тем не менее, ни одно из этих расширений не является допустимым JSON. Если вы создаете API или обмениваетесь данными между системами, придерживайтесь стандартного JSON. Используйте расширения только там, где инструменты явно их поддерживают.
Заключение
JSON преуспел не потому, что он идеален, а потому, что он достаточно хорош для почти всего и очень прост в использовании. Его ограниченная типовая система временами разочаровывает (где мои даты?), а правило об отсутствии комментариев является настоящей болью. Но эти ограничения также делают его универсально совместимым.
Если вы только начинаете, лучший способ изучить JSON — это работать с ним на практике. Попробуйте вставить некоторые данные в наши инструменты, намеренно сломать что-то и посмотреть, что произойдет. Понимание сообщений об ошибках — это половина битвы.
Продолжайте исследовать:
- JSON против YAML — когда использовать каждый формат
- JSON против XML — почему JSON заменил XML для большинства случаев использования
- JSON Validator — проверьте, является ли ваш JSON допустимым
- JSON Schema Generator — автоматически генерируйте схемы из данных JSON