Введение
JSON — это формат данных, который вы встречаете каждый день, даже если не осознаёте этого. Каждый API-ответ, каждый конфигурационный файл, каждое сообщение между микросервисами — с большой вероятностью это JSON.
Формат настолько прост, что его можно освоить за 15 минут. Но за этой простотой скрываются нюансы: правила синтаксиса, особенности типов данных, валидация, работа с большими файлами — всё это мы разберём в этом руководстве.
В этой статье вы узнаете:
- ✅ Что такое JSON и почему он стал стандартом
- ✅ Синтаксис и все типы данных
- ✅ Работа с JSON в JavaScript, Python и PHP
- ✅ JSON vs XML — когда что выбрать
- ✅ Валидация с JSON Schema
- ✅ Частые ошибки и как их избежать
📋 Содержание
Что такое JSON
JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на синтаксисе объектов JavaScript. Несмотря на название, JSON не привязан к JavaScript — его поддерживают все современные языки программирования.
Простыми словами:
JSON — это способ записать данные в текстовом виде так, чтобы их легко могли прочитать и люди, и компьютеры. Это как универсальный язык, на котором программы обмениваются информацией.
JSON используется повсюду:
- REST API — формат запросов и ответов
- Конфигурации —
package.json,tsconfig.json,.eslintrc.json - Базы данных — MongoDB, PostgreSQL (JSONB), CouchDB
- Обмен данными — между микросервисами, клиентом и сервером
- Хранение — localStorage в браузере, файлы настроек
Краткая история
| Год | Событие |
|---|---|
| 2001 | Дуглас Крокфорд придумывает JSON |
| 2006 | RFC 4627 — первая спецификация |
| 2013 | ECMA-404 — JSON становится международным стандартом |
| 2017 | RFC 8259 — актуальная спецификация |
Синтаксис JSON
JSON строится на двух структурах:
- Объект — набор пар «ключ: значение» в фигурных скобках
{ } - Массив — упорядоченный список значений в квадратных скобках
[ ]
Объект
{
"name": "Иван Петров",
"age": 30,
"email": "ivan@example.com",
"is_active": true
}
Массив
[
"JavaScript",
"Python",
"Go",
"PHP"
]
Правила синтаксиса
| Правило | Правильно | Неправильно |
|---|---|---|
| Ключи — только в двойных кавычках | {"name": "Иван"} |
{name: "Иван"} |
| Строки — только в двойных кавычках | "hello" |
'hello' |
| Нет завершающей запятой | {"a": 1, "b": 2} |
{"a": 1, "b": 2,} |
| Нет комментариев | {"a": 1} |
{"a": 1} // comment |
| Числа без кавычек | {"age": 30} |
{"age": "30"} (это строка) |
⚠️ Самая частая ошибка: trailing comma
{
"name": "Иван",
"age": 30, ← запятая после последнего элемента
}
В JavaScript-объектах это допустимо, в JSON — нет. Парсер выдаст ошибку.
Типы данных
JSON поддерживает 6 типов данных:
| Тип | Пример | Описание |
|---|---|---|
| string | "Привет мир" |
Текст в двойных кавычках. Поддерживает Unicode, escape-последовательности (\n, \t, \") |
| number | 42, 3.14, -17, 2.5e10 |
Целые и дробные числа. Нет разделения на int/float. Нет NaN, Infinity |
| boolean | true, false |
Логический тип. Только строчные буквы (не True, не TRUE) |
| null | null |
Отсутствие значения. Только строчными (не NULL, не None) |
| object | {"key": "value"} |
Набор пар ключ-значение в { } |
| array | [1, 2, 3] |
Упорядоченный список в [ ]. Элементы могут быть любого типа |
⚠️ Чего НЕТ в JSON
- Дата/время — используйте строку ISO 8601:
"2026-02-23T10:30:00Z" - undefined — только
null - Функции — JSON содержит только данные
- Комментарии — не поддерживаются
- NaN / Infinity — используйте
nullили строку - Бинарные данные — используйте Base64-строку
Вложенность и массивы
Настоящая мощь JSON — в комбинации объектов и массивов. Пример реального API-ответа:
{
"user": {
"id": 42,
"name": "Иван Петров",
"email": "ivan@example.com",
"address": {
"city": "Москва",
"country": "Россия",
"coordinates": {
"lat": 55.7558,
"lng": 37.6173
}
},
"skills": ["JavaScript", "Python", "Go"],
"projects": [
{
"id": 1,
"name": "API Gateway",
"status": "active",
"tags": ["backend", "microservices"]
},
{
"id": 2,
"name": "Dashboard",
"status": "completed",
"tags": ["frontend", "react"]
}
],
"settings": {
"theme": "dark",
"notifications": {
"email": true,
"push": false,
"sms": null
}
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-23T10:30:00Z"
}
}
Доступ к вложенным данным:
data.user.name // "Иван Петров"
data.user.address.city // "Москва"
data.user.address.coordinates.lat // 55.7558
data.user.skills[0] // "JavaScript"
data.user.projects[1].name // "Dashboard"
data.user.projects[0].tags[1] // "microservices"
data.user.settings.notifications.email // true
JSON в JavaScript
JavaScript имеет встроенный объект JSON с двумя методами:
JSON.parse() — строка в объект
const jsonString = '{"name": "Иван", "age": 30}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // "Иван"
console.log(obj.age); // 30
// С reviver-функцией (преобразование при парсинге)
const data = JSON.parse(jsonString, (key, value) => {
if (key === 'age') return value + 1;
return value;
});
// data.age === 31
JSON.stringify() — объект в строку
const user = {
name: "Иван",
age: 30,
skills: ["JS", "Python"]
};
// Компактная строка
JSON.stringify(user);
// '{"name":"Иван","age":30,"skills":["JS","Python"]}'
// Красивый вывод (с отступами)
JSON.stringify(user, null, 2);
// {
// "name": "Иван",
// "age": 30,
// "skills": [
// "JS",
// "Python"
// ]
// }
// С фильтрацией полей
JSON.stringify(user, ['name', 'age']);
// '{"name":"Иван","age":30}'
// С replacer-функцией
JSON.stringify(user, (key, value) => {
if (typeof value === 'number') return undefined;
return value;
});
// '{"name":"Иван","skills":["JS","Python"]}'
fetch + JSON
// GET — получение JSON
const response = await fetch('/api/users');
const users = await response.json();
// POST — отправка JSON
await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Иван', email: 'ivan@test.ru' })
});
JSON в Python
import json
# Строка → словарь
json_string = '{"name": "Иван", "age": 30, "is_active": true}'
data = json.loads(json_string)
print(data['name']) # Иван
print(type(data)) # <class 'dict'>
# Словарь → строка
user = {
'name': 'Иван',
'age': 30,
'skills': ['Python', 'Go'],
'address': None
}
# Компактно
json.dumps(user)
# '{"name": "\u0418\u0432\u0430\u043d", ...}'
# Красиво + кириллица
json.dumps(user, indent=2, ensure_ascii=False)
# {
# "name": "Иван",
# "age": 30,
# "skills": ["Python", "Go"],
# "address": null
# }
# Чтение из файла
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# Запись в файл
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(user, f, indent=2, ensure_ascii=False)
Маппинг типов Python ↔ JSON
| Python | JSON |
|---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True / False | true / false |
None | null |
JSON в PHP
<?php
// Строка → массив/объект
$jsonString = '{"name": "Иван", "age": 30, "skills": ["PHP", "Laravel"]}';
$data = json_decode($jsonString, true); // true = ассоциативный массив
echo $data['name']; // Иван
echo $data['age']; // 30
$obj = json_decode($jsonString); // объект stdClass
echo $obj->name; // Иван
// Массив → строка
$user = [
'name' => 'Иван',
'age' => 30,
'skills' => ['PHP', 'Laravel'],
'address' => null
];
// Компактно
echo json_encode($user);
// Красиво + кириллица
echo json_encode($user, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// {
// "name": "Иван",
// "age": 30,
// "skills": ["PHP", "Laravel"],
// "address": null
// }
// Проверка ошибок
$result = json_decode('invalid json');
if (json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка: ' . json_last_error_msg();
}
// PHP 7.3+: флаг JSON_THROW_ON_ERROR
try {
$data = json_decode('invalid', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'JSON ошибка: ' . $e->getMessage();
}
JSON vs XML
Одни и те же данные в двух форматах:
JSON (86 байт)
{
"user": {
"name": "Иван",
"age": 30,
"active": true
}
}
XML (165 байт)
<?xml version="1.0"?>
<user>
<name>Иван</name>
<age>30</age>
<active>true</active>
</user>
| Характеристика | JSON | XML |
|---|---|---|
| Размер | Компактный | В 2-3 раза больше |
| Читаемость | Высокая | Средняя (теги загромождают) |
| Парсинг | Быстрый (JSON.parse) | Медленнее (DOM/SAX) |
| Типы данных | 6 типов (string, number, boolean, null, object, array) | Всё — строки (типизация через XSD) |
| Комментарии | Нет | Да (<!-- -->) |
| Атрибуты | Нет | Да (<user id="42">) |
| Namespaces | Нет | Да |
| Валидация | JSON Schema | XSD, DTD |
| Применение | REST API, конфигурации, NoSQL | SOAP, RSS, SVG, конфиги |
Когда что выбрать?
- JSON — REST API, веб-приложения, конфигурации, NoSQL базы
- XML — SOAP, RSS/Atom, SVG, документы с метаданными, legacy-интеграции
Валидация: JSON Schema
JSON Schema — стандарт для описания структуры JSON-документа. Позволяет проверять: какие поля обязательны, какого типа значения, допустимые диапазоны.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "email"],
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 100,
"description": "Имя пользователя"
},
"email": {
"type": "string",
"format": "email",
"description": "Email адрес"
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"role": {
"type": "string",
"enum": ["admin", "user", "moderator"],
"default": "user"
},
"tags": {
"type": "array",
"items": { "type": "string" },
"uniqueItems": true,
"maxItems": 10
}
},
"additionalProperties": false
}
Валидация в коде
// Node.js (ajv — самый быстрый валидатор)
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = {
type: 'object',
required: ['name', 'email'],
properties: {
name: { type: 'string', minLength: 2 },
email: { type: 'string', format: 'email' }
}
};
const validate = ajv.compile(schema);
const valid = validate({ name: 'Иван', email: 'ivan@test.ru' });
console.log(valid); // true
const invalid = validate({ name: '' });
console.log(validate.errors);
// [{ keyword: 'minLength', ... }, { keyword: 'required', ... }]
# Python (jsonschema)
from jsonschema import validate, ValidationError
schema = {
"type": "object",
"required": ["name", "email"],
"properties": {
"name": {"type": "string", "minLength": 2},
"email": {"type": "string", "format": "email"}
}
}
try:
validate(instance={"name": "Иван", "email": "ivan@test.ru"}, schema=schema)
print("Валидно!")
except ValidationError as e:
print(f"Ошибка: {e.message}")
Частые ошибки
❌ Ошибка 1: Одинарные кавычки
{'name': 'Иван'} ← ОШИБКА: одинарные кавычки
{"name": "Иван"} ← правильно: двойные кавычки
❌ Ошибка 2: Trailing comma (висящая запятая)
{"a": 1, "b": 2,} ← ОШИБКА: запятая после последнего элемента
{"a": 1, "b": 2} ← правильно
❌ Ошибка 3: Ключи без кавычек
{name: "Иван"} ← ОШИБКА: ключ без кавычек (это JS, не JSON)
{"name": "Иван"} ← правильно
❌ Ошибка 4: undefined, NaN, Infinity
{"value": undefined} ← ОШИБКА: undefined не существует в JSON
{"value": NaN} ← ОШИБКА: NaN не существует в JSON
{"value": null} ← правильно: используйте null
❌ Ошибка 5: Числа в кавычках
{"age": "30"} ← это строка "30", не число
{"age": 30} ← это число 30
Частая ошибка при ручном составлении JSON. "30" и 30 — разные типы.
Продвинутые темы
JSON Lines (NDJSON)
Для потоковой обработки больших данных — каждая строка файла является отдельным JSON-объектом:
{"id": 1, "name": "Иван", "action": "login"}
{"id": 2, "name": "Мария", "action": "purchase"}
{"id": 3, "name": "Алексей", "action": "logout"}
Преимущество: файл можно читать построчно, не загружая целиком в память. Используется в логах, Big Data, потоковых API.
JSON5 — расширенный JSON
Неофициальное расширение, добавляющее удобства:
// JSON5 — допускает:
{
// Комментарии
name: 'Иван', // ключи без кавычек
'surname': "Петров", // одинарные кавычки
age: 30, // trailing comma
bio: 'Строка с \
переносом', // многострочные строки
hex: 0xFF, // шестнадцатеричные числа
infinity: Infinity, // Infinity и NaN
}
Удобен для конфигурационных файлов, но не для API — не является стандартом.
JSON Pointer и JSON Patch
// JSON Pointer (RFC 6901) — путь к значению
"/user/address/city" → data.user.address.city
"/users/0/name" → data.users[0].name
// JSON Patch (RFC 6902) — описание изменений
[
{ "op": "replace", "path": "/name", "value": "Пётр" },
{ "op": "add", "path": "/phone", "value": "+7999" },
{ "op": "remove", "path": "/temp_field" }
]
JSON Patch позволяет описать изменения в документе без отправки всего объекта — используется в PATCH-запросах HTTP API.
FAQ
❓ Чем JSON отличается от XML?
Ответ: JSON компактнее (в 2-3 раза), легче читается, быстрее парсится и нативно поддерживается в JavaScript. XML поддерживает атрибуты, комментарии, namespaces и строгую валидацию через XSD. JSON — стандарт для REST API, XML — для SOAP, RSS и legacy-систем.
❓ Можно ли добавлять комментарии в JSON?
Ответ: Нет, стандартный JSON (RFC 8259) не поддерживает комментарии. Это осознанное решение Дугласа Крокфорда. Для конфигурационных файлов с комментариями используйте:
- JSONC — JSON with Comments (поддерживается VS Code)
- JSON5 — расширенный JSON с комментариями и relaxed синтаксисом
- YAML — полностью поддерживает комментарии
❓ Что такое JSON Schema?
Ответ: JSON Schema — стандарт для описания структуры и ограничений JSON-документа: какие поля обязательны, какого типа должны быть значения, допустимые диапазоны, форматы (email, URI, date). Используется для валидации данных в API, генерации документации и UI-форм.
❓ Какой максимальный размер JSON-файла?
Ответ: Спецификация не ограничивает размер. На практике ограничения зависят от окружения: HTTP-серверы обычно ставят лимит 1-10 МБ на тело запроса, JSON.parse() в браузере работает с файлами до сотен мегабайт. Для больших объёмов используйте:
- JSON Lines (NDJSON) — построчное чтение
- Потоковые парсеры —
JSONStream(Node.js),ijson(Python) - Пагинацию API — отдавайте данные порциями
Заключение
📝 Ключевые тезисы
| Тема | Суть |
|---|---|
| Формат | Текстовый, машиночитаемый, человекочитаемый |
| Типы | string, number, boolean, null, object, array |
| Синтаксис | Двойные кавычки, нет trailing comma, нет комментариев |
| Парсинг | JSON.parse/stringify (JS), json.loads/dumps (Python), json_decode/encode (PHP) |
| Валидация | JSON Schema (ajv, jsonschema) |
| Альтернативы | XML (тяжёлый), YAML (с комментариями), MessagePack (бинарный) |
JSON стал универсальным языком обмена данными не случайно — он простой, лёгкий и поддерживается везде. Освойте его синтаксис, типы данных и инструменты валидации — и вы будете уверенно работать с любым API.
💡 Что делать дальше?
- Попрактикуйтесь — откройте jsonlint.com и проверьте валидность JSON
- Изучите JSON Schema — для валидации данных в API
- Прочитайте про REST API — JSON в действии
- Попробуйте создать API — с Swagger/OpenAPI
🎯 Создайте JSON API за 2 минуты
Хотите быстро создать API, который возвращает JSON-ответы с нужной структурой?
LightBox API позволяет создать Mock API с произвольными JSON-ответами через веб-интерфейс — без сервера и без кода.
- ✓ Любая структура JSON-ответа
- ✓ Настройка HTTP статус кодов и заголовков
- ✓ Импорт Swagger/OpenAPI
- ✓ Логирование всех запросов
- ✓ Бесплатный план для старта
Статья опубликована: 23 февраля 2026
Автор: LightBox API Team