Формат JSON: полное руководство с примерами

← Вернуться к статьям

Введение

JSON — это формат данных, который вы встречаете каждый день, даже если не осознаёте этого. Каждый API-ответ, каждый конфигурационный файл, каждое сообщение между микросервисами — с большой вероятностью это JSON.

Формат настолько прост, что его можно освоить за 15 минут. Но за этой простотой скрываются нюансы: правила синтаксиса, особенности типов данных, валидация, работа с большими файлами — всё это мы разберём в этом руководстве.

В этой статье вы узнаете:

📋 Содержание

Что такое JSON

JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на синтаксисе объектов JavaScript. Несмотря на название, JSON не привязан к JavaScript — его поддерживают все современные языки программирования.

Простыми словами:

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

JSON используется повсюду:

Краткая история

Год Событие
2001Дуглас Крокфорд придумывает JSON
2006RFC 4627 — первая спецификация
2013ECMA-404 — JSON становится международным стандартом
2017RFC 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

Вложенность и массивы

Настоящая мощь 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

PythonJSON
dictobject
list, tuplearray
strstring
int, floatnumber
True / Falsetrue / false
Nonenull

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>
ХарактеристикаJSONXML
РазмерКомпактныйВ 2-3 раза больше
ЧитаемостьВысокаяСредняя (теги загромождают)
ПарсингБыстрый (JSON.parse)Медленнее (DOM/SAX)
Типы данных6 типов (string, number, boolean, null, object, array)Всё — строки (типизация через XSD)
КомментарииНетДа (<!-- -->)
АтрибутыНетДа (<user id="42">)
NamespacesНетДа
ВалидацияJSON SchemaXSD, DTD
ПрименениеREST API, конфигурации, NoSQLSOAP, RSS, SVG, конфиги

Когда что выбрать?

Валидация: 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.

💡 Что делать дальше?

  1. Попрактикуйтесь — откройте jsonlint.com и проверьте валидность JSON
  2. Изучите JSON Schema — для валидации данных в API
  3. Прочитайте про REST API — JSON в действии
  4. Попробуйте создать API — с Swagger/OpenAPI

🎯 Создайте JSON API за 2 минуты

Хотите быстро создать API, который возвращает JSON-ответы с нужной структурой?

LightBox API позволяет создать Mock API с произвольными JSON-ответами через веб-интерфейс — без сервера и без кода.

Попробовать бесплатно →

Статья опубликована: 23 февраля 2026
Автор: LightBox API Team