Bezdepbonusu7Программирование: статьи и ответы

Форматы данных

JSON - что это такое: формат данных с примерами

Редакция Bezdepbonusu77 мин чтения

JSON - это текстовый формат обмена данными из объектов, массивов и простых значений, который понимают все популярные языки. Разбираем синтаксис, типы, чтение и запись в Python и JavaScript, а также ошибки, из-за которых парсер падает.

Серверы дата-центра, где хранятся и передаются данные в формате JSON
Фото: Christopher Bowns, CC BY-SA 2.0, Wikimedia Commons
Содержание
  1. Что такое JSON
  2. Синтаксис
  3. Типы данных
  4. JSON в Python
  5. JSON в JavaScript
  6. Ошибки парсинга
  7. Инструменты
  8. JSON и другие форматы
  9. Частые вопросы

JSON: что это и откуда взялся

JSON (JavaScript Object Notation) - текстовый формат для хранения и передачи структурированных данных. Это обычный текст, который легко читает человек и быстро разбирает программа. Формат вырос из синтаксиса объектов JavaScript, его популяризировал Дуглас Крокфорд в начале 2000-х, но сегодня JSON не зависит от языка: с ним работают Python, Java, Go, PHP, C# и практически всё остальное.

Формат описан двумя стандартами: RFC 8259 (IETF, 2017) и ECMA-404. Несколько формальных фактов, которые пригодятся:

  • расширение файла - .json;
  • MIME-тип для HTTP - application/json;
  • кодировка при обмене между системами - UTF-8;
  • комментарии стандартом не предусмотрены.

Где вы встретите JSON: ответы веб-API, конфиги (package.json в Node.js, settings.json в VS Code, tsconfig.json), экспорт данных из сервисов, поля типа JSON и JSONB в PostgreSQL, логи в структурированном виде. Как JSON используется в обмене между клиентом и сервером, подробно показано в статье что такое API.

Синтаксис JSON за 5 минут

Весь формат держится на двух структурах: объект и массив.

  • Объект - пары "ключ: значение" в фигурных скобках {}, пары разделяются запятыми.
  • Массив - упорядоченный список значений в квадратных скобках [].

Значением может быть строка, число, true, false, null, объект или массив. Вложенность не ограничена. Пример карточки студента:

{
  "name": "Иван Петров",
  "age": 21,
  "gpa": 4.6,
  "is_student": true,
  "mentor": null,
  "skills": ["Python", "SQL", "Git"],
  "address": {
    "city": "Москва",
    "metro": "Бауманская"
  }
}

Строгие правила, на которых спотыкаются чаще всего:

  1. Ключи - только строки и только в двойных кавычках. {name: "Иван"} и {'name': 'Иван'} - невалидный JSON.
  2. После последнего элемента запятой нет.
  3. true, false, null пишутся строчными буквами.
  4. Числа без ведущих нулей и без кавычек. NaN и Infinity не допускаются.
  5. Спецсимволы в строках экранируются обратным слешем: \", \\, \n.

Типы данных JSON в Python и JavaScript

При разборе JSON каждое значение превращается в родной тип языка. Таблица соответствий для двух самых популярных языков:

JSONPythonJavaScript
objectdictObject
arraylistArray
stringstrstring
number (целое)intnumber
number (дробное)floatnumber
true / falseTrue / Falsetrue / false
nullNonenull

Дат в JSON нет. Их передают строкой, обычно в формате ISO 8601: "2026-10-24T12:30:00Z", и превращают в объект даты вручную. То же с множествами, Decimal и бинарными данными: всё это нужно явно конвертировать.

Ещё одна ловушка: в Python кортеж при сериализации станет массивом, а после обратного чтения вернётся уже списком. Числовые ключи словаря превратятся в строки: {1: "a"} после круга dumps/loads станет {"1": "a"}.

Как работать с JSON в Python

В Python есть встроенный модуль json, ничего ставить не нужно. Четыре функции покрывают 95% задач. Запомнить просто: буква s на конце означает string.

  • json.loads(строка) - строка JSON в объект Python;
  • json.dumps(объект) - объект Python в строку JSON;
  • json.load(файл) - читает JSON из открытого файла;
  • json.dump(объект, файл) - пишет JSON в файл.
import json

user = {"name": "Анна", "langs": ["Python", "Go"], "active": True}

# запись в файл
with open("user.json", "w", encoding="utf-8") as f:
    json.dump(user, f, ensure_ascii=False, indent=2)

# чтение из файла
with open("user.json", encoding="utf-8") as f:
    data = json.load(f)

print(data["langs"][0])   # Python

Два параметра, без которых кириллица превращается в кашу:

  • ensure_ascii=False - оставляет русские буквы как есть вместо \u0410\u043d\u043d\u0430;
  • encoding="utf-8" в open() - иначе на Windows файл может открыться в кодировке cp1251 и упасть с UnicodeDecodeError.

Параметр indent=2 добавляет отступы для читаемости, sort_keys=True сортирует ключи. Для собственных классов используйте аргумент default: json.dumps(obj, default=str) превратит даты и прочие несериализуемые объекты в строки. Если вы только начинаете путь в языке, пригодится план изучения Python с нуля.

JSON в JavaScript: parse и stringify

В JavaScript работа с JSON встроена в глобальный объект JSON:

const text = '{"name": "Анна", "age": 25}';
const user = JSON.parse(text);          // строка -> объект
console.log(user.age + 1);              // 26

const back = JSON.stringify(user, null, 2);   // объект -> строка с отступами
localStorage.setItem("user", back);

Ответ сервера при fetch разбирают методом response.json(), он возвращает промис. Чего ждать от JSON.stringify:

  • свойства со значением undefined и функции просто пропадают;
  • объект Date превращается в строку ISO;
  • NaN и Infinity становятся null;
  • циклические ссылки вызывают TypeError;
  • BigInt без своей обработки тоже бросает TypeError.

Глубокое копирование через JSON.parse(JSON.stringify(obj)) всё ещё встречается в старом коде, но из-за потерь выше лучше использовать встроенную функцию structuredClone(obj). Другие приёмы работы с данными в JS разобраны в материале про методы массивов JavaScript.

Частые ошибки в JSON и как их исправить

Парсер JSON не прощает ни одной лишней запятой. Самые частые ситуации:

СимптомПричинаЧто сделать
Expecting property name enclosed in double quotesОдинарные кавычки или ключ без кавычек. В старых версиях Python так же выглядит лишняя запятая в конце объектаЗаменить кавычки на двойные, убрать висячую запятую
Expecting value: line 1 column 1 (char 0)Пустая строка или вместо JSON пришёл HTML (например, страница ошибки 502)Проверить код ответа и содержимое перед разбором
Extra dataВ файле несколько объектов подрядОбернуть в массив или читать построчно как JSON Lines
Unexpected UTF-8 BOMФайл сохранён в "UTF-8 с BOM" (часто Блокнот в Windows)Открывать с encoding="utf-8-sig" или пересохранить без BOM
Unexpected token в JSКомментарии, одинарные кавычки, undefinedУдалить комментарии, проверить строку валидатором

Отдельный подвох Python: json.dumps(float("nan")) по умолчанию выдаёт NaN, хотя это невалидный JSON, и другой язык его не прочитает. Передайте allow_nan=False, чтобы получать ошибку сразу, а не у потребителя данных.

Если API вернул "Expecting value", не чините JSON. Распечатайте первые 200 символов ответа: print(r.status_code, r.text[:200]). В девяти случаях из десяти там окажется HTML-страница с ошибкой, редирект на авторизацию или пустой ответ.

Как открыть, проверить и отформатировать JSON-файл

JSON - обычный текст, открыть его можно любым редактором. Но для больших файлов есть способы удобнее:

  1. VS Code. Подсветка и проверка синтаксиса из коробки. Форматирование - Shift+Alt+F в Windows и Linux, Shift+Option+F в macOS. Как настроить редактор под себя, рассказано в статье про настройку VS Code.
  2. Браузер. Firefox показывает JSON в виде дерева со сворачиванием и фильтром. В Chrome и Яндекс Браузере есть похожий просмотрщик, а также расширения.
  3. Python из терминала. Встроенная утилита проверяет и красиво печатает файл:
    python -m json.tool data.json
    python -m json.tool --sort-keys data.json pretty.json
  4. jq. Консольная утилита для выборок из JSON, незаменима при работе с API:
    curl -s https://api.github.com/users/octocat | jq '.login, .public_repos'
    jq '.items[] | select(.price > 1000) | .name' products.json

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

JSON, XML, YAML, CSV: когда что выбрать

JSON не единственный текстовый формат данных, и у каждого своя ниша:

  • XML - многословнее, зато умеет атрибуты, пространства имён и строгие схемы XSD. Живёт в SOAP-сервисах, банковских обменах, офисных документах.
  • YAML - надмножество JSON с отступами вместо скобок и с комментариями. Любим DevOps-инженерами: конфиги Docker Compose, Kubernetes, GitHub Actions. Минус - чувствительность к пробелам.
  • CSV - плоские таблицы, удобно открывать в Excel. Вложенность не поддерживает.
  • JSON Lines (.jsonl) - по одному JSON-объекту на строку. Подходит для логов и больших выгрузок: файл можно читать построчно, не загружая целиком в память.

Для обмена данными по сети и хранения настроек приложений JSON остаётся выбором по умолчанию. Когда нужна проверка структуры, к нему добавляют JSON Schema: отдельный файл описывает обязательные поля и их типы, а библиотека проверяет документы автоматически. Больше практики по языкам ищите в разделах Python и JavaScript.

Частые вопросы

Как расшифровывается JSON?

JavaScript Object Notation, то есть нотация объектов JavaScript. Несмотря на название, формат независим от языка и поддерживается практически везде.

Можно ли писать комментарии в JSON?

Стандарт RFC 8259 комментарии не допускает, и строгие парсеры на них падают. Некоторые инструменты принимают расширенный формат JSONC (например, настройки VS Code), но для обмена данными комментарии не используйте. Пояснения можно хранить в отдельном поле или перейти на YAML.

Чем отличается json.load от json.loads?

json.load читает данные из открытого файла, json.loads разбирает строку. Аналогично json.dump пишет в файл, а json.dumps возвращает строку.

Чем открыть JSON-файл на Windows?

Подойдёт любой текстовый редактор, удобнее всего VS Code или Notepad++. Для просмотра в виде дерева можно перетащить файл в окно Firefox.

Почему вместо русских букв в JSON видно \u041f\u0440?

Это экранирование Unicode, json.dumps в Python включает его по умолчанию. Данные не испорчены, но для читаемости передайте ensure_ascii=False и пишите файл с encoding="utf-8".

Источники

PythonJavaScriptJSON

Похожие материалы

Версии программ и команды проверены на дату публикации. Если что-то изменилось, сверяйтесь с официальной документацией. Нашли неточность? Напишите на admin@bezdepbonusu7.win.