Руководство программиста по работе с данными и JSON в Python

Последнее обновление: 12/29/2025
  • JSON четко соответствует основным типам данных Python, где объекты и массивы представлены в виде словарей и списков, что упрощает обмен данными.
  • Модуль json в Python предоставляет гибкие функции дампа/загрузки с возможностями форматированного вывода, пользовательскими кодировщиками и стабильным порядком ключей.
  • Чтение, запись и анализ вложенных JSON-данных из файлов и API основаны на одних и тех же базовых инструментах в сочетании с тщательной обработкой ошибок.
  • Помимо базовой сериализации, JSON в Python поддерживает форматирование, проверку данных и интеграцию с другими форматами данных, такими как CSV и XML.

Учебное пособие по работе с данными JSON в Python

JSON незаметно стал языком по умолчанию для передачи данных в интернете. Если вы пишете на Python, вы сталкиваетесь с ним повсюду: API, файлы конфигурации, небольшие «базы данных» для сторонних проектов, логи и даже тестовые наборы. Понимание того, как типы данных Python соотносятся с JSON и как... json «Модуль действительно работает» — это один из тех навыков, который внезапно упрощает множество повседневных задач.

В этом руководстве рассматривается JSON с точки зрения программиста на Python. В этом разделе объясняется, что такое JSON, как он связан с JavaScript, какие типы данных Python он может представлять, а также как анализировать, генерировать, форматировать, проверять и настраивать JSON с помощью JavaScript. jsonМы также рассмотрим реальные примеры использования, такие как работа с файлами и API, а также приемы обработки вложенных данных и граничных случаев, таких как ошибки или специальные значения. NaN и бесконечности.

Что такое JSON и как он связан с данными в Python.

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

Концептуально JSON использует всего два составных строительных блока: объект JavaScript и массив JavaScript . Объект ведёт себя во многом как словарь Python, а массив — как список Python. С помощью этих двух элементов, а также небольшого набора примитивных типов, JSON может описывать сложные вложенные структуры данных.

В JavaScript (и JSON) объект выглядит следующим образом: {"key1": value1, "key2": value2}Это набор пар ключ-значение, где ключи — это строки, а значения могут быть любыми допустимыми значениями JSON (включая другие объекты или массивы). Это очень похоже на Python. dict.

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

Сопоставление типов JSON и типов Python очень простое, поэтому иногда в шутку его называют «PYON» (Python Object Notation). При кодировании или декодировании JSON в Python действуют следующие соответствия:

  • JSON-объект → Питон dict
  • Массив JSON → Питон list
  • Строка JSON → Питон str
  • Число в формате JSON (целое число) → Питон int
  • Число в формате JSON (реальное) → Питон float
  • JSON true Питон True
  • JSON false Питон False
  • JSON null Питон None

Одним из важных ограничений является то, что ключи JSON-объектов всегда являются строками. Итак, если вы закодируете код на Python dict Если ключи не являются строками (например, целыми числами или кортежами), они будут преобразованы в строки или вызовут ошибки в зависимости от ваших настроек. JSON отлично подходит для сохранения структурированных данных, таких как конфигурации или записи, но он имеет свои недостатки. не Универсальный механизм сериализации произвольных объектов Python.

сопоставление данных JSON в Python

Встроенный модуль json в Python

В Python поставляется стандартный библиотечный модуль, называемый json, Это предоставляет вам все необходимое для работы с JSON: разбор строк, загрузка данных из файлов, сериализация объектов Python, а также настройка способов кодирования и декодирования данных. Для выполнения типичных задач, связанных с JSON, вам не потребуется никаких внешних зависимостей.

Четыре основные функции, которые вы будете использовать большую часть времени, это: json.dumps() и json.dump() для преобразования объектов Python в JSON, и json.loads() и json.load() для преобразования JSON обратно в типы данных Python. Версии с префиксом «s» работают со строками, а версии без «s» — с объектами, подобными файлам.

json Кодировщик по умолчанию поддерживает определенный набор типов Python. а именно dict, list, tuple (в виде массивов), str, числа (int, floatи перечисления, производные от целых чисел и чисел с плавающей запятой), а также три специальных синглтона. True, False и NoneЭти данные преобразуются в их JSON-эквиваленты в соответствии с описанной ранее процедурой сопоставления.

Если вам необходимо сериализовать пользовательские объекты или типы данных, Модуль обладает расширяемостью: можно создать подкласс кодировщика JSON и реализовать его функционал. default() метод или передать пользовательский default функция в json.dump() / json.dumps()Этот пользовательский хук должен возвращать что-то, что можно сериализовать в JSON (например, dict or list), или поднять TypeError если оно не знает, как обрабатывать данный объект.

Внутри модуля также доступны такие методы, как: encode() и iterencode(), которые преобразуют данные Python в строки JSON, с помощью iterencode() Постепенная выдача закодированных фрагментов. Этот метод используется реже, но о нем стоит знать, если вам необходимо передавать очень большие JSON-ответы.

Преобразование объектов Python в JSON

Чтобы преобразовать данные Python в текстовый формат JSON, используется следующий код: json.dump() or json.dumps(), Это зависит от того, хотите ли вы записывать данные непосредственно в файл или получать JSON-строку в памяти. Обе функции используют одни и те же основные параметры, позволяющие управлять процессом преобразования.

Функция json.dump(obj, fp, ...) принимает объект Python и файлоподобный объект. и записывает JSON-представление obj к этому файлу. Его аналог в оперативной памяти, json.dumps(obj, ...)Обе функции возвращают строку JSON вместо записи в файл. Обе принимают ряд именованных аргументов, таких как: skipkeys, ensure_ascii, check_circular, allow_nan, indent, separators, default и sort_keys.

Каждый из этих параметров изменяет поведение кодировки таким образом, что это имеет большое значение в реальных проектах: вы можете выбрать, пропускать ли недействительные ключи, принудительно выводить данные в формате ASCII, форматировать результат, контролировать пробелы, определять пользовательскую сериализацию для нестандартных объектов или стабилизировать порядок ключей для тестирования и сравнения изменений.

Вот что означают основные параметры на практике:

  • skipkeys: если установлено на True, ключи словаря, которые не относятся к типу str, int, float, bool or None вместо того, чтобы вызывать TypeErrorЕсли вам требуется быстрое реагирование на ошибки при работе со странными ключами, оставьте значение как есть. False.
  • ensure_ascii: когда True (по умолчанию) не-ASCII и непечатаемые символы экранируются (например, как \uXXXXТаким образом, вывод остается в чистом ASCII-коде. FalseСимволы Юникода записываются как есть, что обычно лучше для удобочитаемых конфигурационных файлов или журналов.
  • check_circular: if TrueКодировщик проверяет наличие циклических ссылок в списках, словарях и объектах, закодированных с помощью пользовательского кода, чтобы предотвратить бесконечную рекурсию. Установка его значения на False это разрушает эту систему защиты и может привести к RecursionError если ваши структуры являются самореферентными.
  • allow_nan: if Trueспециальные значения с плавающей запятой, такие как NaN, Infinity и -Infinity Допускаются и кодируются способом, совместимым с JavaScript, даже если они не являются строго допустимым JSON согласно спецификации. Если FalseПопытка закодировать такие значения вызовет ошибку. ValueError.
  • indent: Неотрицательное целое число (или строка), управляющее форматированием вывода. Положительное число означает количество пробелов на каждом уровне вложенности. Строка (например, "\t") используется непосредственно для отступа. None (По умолчанию) выбирается наиболее компактное представление, без лишних символов новой строки сверх необходимого.
  • separators: кортеж (item_separator, key_separator) управление пунктуацией и пробелами между элементами, а также между ключами и значениями. Для получения наиболее компактного JSON обычно используется (",", ":") удалить все необязательные пробелы.
  • default: Функция, которая принимает любой объект, с которым кодировщик не умеет работать. Она должна возвращать JSON-сериализуемую замену (например, dict or list), или поднять TypeErrorЭто основной механизм для обеспечения сериализуемости ваших собственных классов.
  • sort_keys: if TrueСловари кодируются с отсортированными ключами. Это чрезвычайно удобно для регрессионных тестов и воспроизводимых результатов, когда необходимо, чтобы JSON-дампы оставались стабильными при разных запусках.

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

import pathlib
import json

path = pathlib.Path("myTextFile.json")
data =

with path.open(mode="wt") as f:
    json.dump(data, f)

print(json.dumps(data, indent=4))

Благодаря этому, распечатанный JSON будет иметь красивый формат. indent=4, Отображение каждого элемента списка и ключа словаря на отдельной строке. Это значительно упрощает отладку и ручное редактирование по сравнению с одной, плотно расположенной строкой текста.

Преобразование JSON обратно в Python

Для преобразования текста JSON обратно в объекты Python, Вы используете соответствующую пару функций: json.load() (для файловоподобных объектов) и json.loads() (для строк JSON). Эти функции анализируют входные данные и воссоздают типы Python в соответствии с той же таблицей сопоставления, что и раньше.

Подписи выглядят примерно так: json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw) и json.loads(s, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw)На базовом уровне вы можете вызывать их, используя только входные данные JSON, но дополнительные аргументы открывают возможности для более сложного анализа данных.

Крючки, подобные object_hook и object_pairs_hook позволяет настраивать способ преобразования объектов JSON в структуры Python. предоставив вам либо расшифрованный текст dict или список (key, value) соответственно. Это полезно, если вы хотите создавать пользовательские классы непосредственно из JSON или сохранять порядок определенным образом.

Другие вызываемые объекты, такие как parse_float, parse_int и parse_constant Это позволяет контролировать интерпретацию чисел и специальных символов. Например, вы можете использовать Decimal вместо float для денежных значений или преобразования "NaN", "inf" и "-inf" в выбранные вами объекты-стражи.

Продолжая предыдущий пример, вы можете прочитать созданный вами JSON-файл следующим образом:

with path.open(mode="rt") as f:
    data = json.load(f)
print(data)

В результате будет получен обычный список и словарь Python. например , которыми можно манипулировать с помощью всех обычных операций Python. С точки зрения вашего кода, это снова «просто данные».

Какие типы данных Python может преобразовать в JSON?

Не каждый объект Python можно преобразовать в JSON без дополнительных настроек. Поэтому полезно помнить о допустимом наборе. Практические кодировщики поддерживают распространенные контейнерные и скалярные типы, а также логические значения. Noneи сопоставить их с минимальным набором типов JSON.

По умолчанию вы можете безопасно передавать следующие объекты Python в json.dumps():

  • dict (закодировано в виде объектов JSON)
  • list и tuple (закодировано в виде массивов JSON)
  • str (закодировано в виде JSON-строк)
  • int и float (закодировано в виде чисел JSON)
  • True и False (закодировано как true и false)
  • None (закодировано как null)

Когда Python кодирует эти данные, преобразование обратно в JSON происходит довольно просто. и наоборот при декодировании. Например, Python tuple превращается в массив JSON, и вы получаете list Загрузка завершена. Перечисления получены из int or float Также могут быть закодированы в виде чисел.

Всё остальное требует индивидуального подхода. default обработчик (преобразовать объекты в сериализуемое представление) или вызовет TypeErrorЭто сделано намеренно: JSON предназначен для данных, а не для произвольных графов объектов с поведением и методами, как это можно было бы сделать при сериализации. pickle.

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

Качественная печать, компактный вывод и упорядоченные клавиши.

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

indent параметр json.dumps() является главным рычагом для качественной печати. Позволяет указать Python, сколько пробелов (или какую строку) использовать на каждом уровне отступа. Типичный выбор: indent=4Хотя в некоторых кодовых базах предпочитают использовать два пробела или символ табуляции, стилистические условности различаются в зависимости от проекта.

separators Этот аргумент позволяет еще точнее настроить пробелы. приведение кортежа, например (", ", ": ") По умолчанию — для удобного для человека вывода. Если вам нужен максимально компактный вариант — например, для уменьшения размера полезной нагрузки при передаче по сети — вы можете установить соответствующий параметр. separators=(",", ":") для удаления пробелов после запятых и двоеточий.

Когда вам важен детерминированный результат, например, в модульных тестах или при сравнении снимков состояния системы, активирующий sort_keys=True Это заставляет кодировщик выводить ключи словаря в отсортированном порядке. Таким образом, два запуска, дающие семантически идентичные данные, не будут отличаться только потому, что словари выдали ключи в разной последовательности.

Вместе indent, separators и sort_keys дает вам большой контроль Речь идёт о том, оптимизирован ли ваш JSON для машинного восприятия (компактный, без пробелов) или для восприятия человеком (с отступами, выровненный, со стабильной формой при разных запусках).

Вложенные данные, стратегии синтаксического анализа и шаблоны доступа.

В реальном мире JSON плоские структуры являются исключением; обычно вы будете иметь дело с вложенными объектами и массивами. Представьте себе типичную запись пользователя в приложении электронной коммерции: личная информация, вложенные адреса доставки, вложенные платежные данные и, возможно, список заказов, каждый из которых представляет собой сложную структуру сам по себе.

При декодировании JSON в Python вложенные данные становятся комбинациями словарей и списков. И вы можете получить к нему доступ, используя стандартные индексы и ключи. Для неглубоких структур это несложно: data, data, И так далее.

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

Невложенный (плоский) JSON проще использовать для прямого доступа с помощью жестко закодированных ключей. Это вполне подходит для небольших утилит или когда вы полностью контролируете ввод. Однако при использовании внешних API обычно пишутся небольшие вспомогательные функции, которые инкапсулируют структуру, чтобы избежать излишнего использования вспомогательного кода. цепочки по всему вашему коду.

Независимо от глубины, то же самое json.loads() Применяется следующее поведение: Функция принимает строку JSON и генерирует собственные типы данных Python, которые затем можно обрабатывать с помощью обычных инструментов Python. Никакого специального синтаксиса, кроме стандартного, не требуется. dict и list индексация.

Работа с JSON-файлами: чтение, запись и добавление данных.

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

Запись JSON в файл обычно представляет собой двухэтапный процесс: сериализация данных в Python с помощью json.dumps() или напрямую с json.dump()а затем убедитесь, что полученная строка записана на диск. Если вы вызовете open('data.json', 'w')В режиме записи вы получаете дескриптор файла, который либо создает файл, либо обрезает его, если он уже существует.

Для вложенных структур протокол ничем не отличается от протокола для плоских данных: вы по-прежнему используете то же самое json.dump() При вызове функции вложенные комбинации списков и словарей кодируются рекурсивно. Обычно вам нужно лишь решить, какой отступ вы хотите использовать для удобства чтения и для уменьшения размера файла.

Чтение JSON из файла — это обратный процесс: файл открывается в текстовом режиме. передайте файловый объект в json.load()И вы получаете обратно свою структуру данных Python. Опять же, поведение не зависит от глубины вложенности — декодер обрабатывает все это за вас.

Если вам нужно добавить данные JSON к существующим файлам, ситуация усложняется. Сам JSON не поддерживает «потоковое добавление» простым способом, поскольку весь файл должен быть корректным JSON. Распространенный подход заключается в хранении массива записей и чтении/изменении/записи всего массива целиком, или в использовании JSON с разделителями строк, где каждая строка представляет собой отдельный объект JSON, к которому можно добавлять данные без перезаписи предыдущих строк.

JSON в реальном мире: API, хранение и обмен данными.

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

При взаимодействии с API формат JSON является наиболее распространенным форматом полезной нагрузки. особенно в RESTful-сервисах. В приложениях на Python обычно используются такие библиотеки, как... requests для отправки HTTP-запросов и получать JSON-ответызатем проанализируйте эти ответы с помощью json.loads() или с помощью вспомогательных методов, которые его оборачивают.

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

Ещё одним важным вариантом использования является сериализация и десериализация структур данных, преобразование коллекций в памяти в строки JSON (сериализация) и последующее их восстановление (десериализация). Таким образом можно хранить пользовательские настройки, передавать структурированные сообщения через очереди или отправлять вложенные объекты через границы сервисов, при условии, что используются типы, совместимые с JSON, или предоставляются собственные кодировщики.

Помимо самого JSON, коду на Python часто требуется преобразовывать данные между форматами JSON и другими форматами, такими как XML, CSV или обычный текст. Например, вы можете прочитать CSV-файл из устаревшей системы, преобразовать его в список словарей, а затем выгрузить в формате JSON для современного API. Или вы можете получить JSON из API, нормализовать его и записать в CSV-файл, чтобы аналитики могли загрузить его в электронные таблицы.

Форматирование, проверка и дополнительные операции с JSON.

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

Красивая печать с помощью json.dumps(..., indent=...) это первый шаг, Это позволяет создавать удобно расположенные иерархии, благодаря которым структурные проблемы легко выявлять с первого взгляда. Это особенно полезно при отладке или при демонстрации примеров в документации.

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

Проверка JSON-данных часто сводится к попытке их анализа и перехвату исключений. Особенно если вы просто проверяете синтаксическую корректность строки. Для более строгих проверок можно использовать JSON Schema и внешние библиотеки, но во многих случаях достаточно простого решения. try/except женщин-заключенных json.loads() достаточно.

Сортировка данных JSON по определенным значениям или ключам может помочь при сравнении ответов. Создание стабильных снимков для тестов или просто обеспечение группировки похожих объектов. Вы можете либо отсортировать базовые списки и словари Python перед сохранением данных, либо полагаться на sort_keys=True когда основное внимание уделяется порядку ключей внутри объектов.

Обработка ошибок при работе с JSON

Даже в хорошо структурированных системах могут возникать проблемы с некорректным JSON-форматом или неожиданными данными. Поэтому надежная обработка ошибок при разборе и кодировании JSON имеет решающее значение. Python выражает эти проблемы с помощью исключений, и идиоматический способ справиться с ними — это обернуть операции в исключения. try...except блоки.

При декодировании JSON наиболее распространенной проблемой является некорректный синтаксис. например, отсутствующие кавычки вокруг названий объектов или запятые в конце. json модуль выдаст ошибку декодирования (обычно) json.JSONDecodeError), которые вы можете перехватить и записать в журнал или преобразовать в удобные для пользователя сообщения.

Например, попытка разобрать некорректную строку может привести к ошибке следующего вида: Failed to decode JSON: Expecting property name enclosed in double quotes: line 1 column 29 (char 28)Такое сообщение указывает не только на ошибку парсинга, но и на то, в какой части входных данных парсер допустил ошибку.

Что касается кодирования, вы можете столкнуться с проблемой. TypeError при попытке сериализации неподдерживаемых типов, or ValueError если вы запретите NaN и бесконечности через allow_nan=False Но ваши данные содержат такие значения. Циклические ссылки в контейнерах также могут вызывать срабатывание. RecursionError если отключить циклические проверки.

Наилучшей практикой является рассмотрение операций с JSON как операций ввода-вывода, подверженных ошибкам. Особенно при чтении из сетевых источников или внешних файлов: всегда предполагайте, что что-то может пойти не так, и обрабатывайте исключения соответствующим образом, возможно, добавляя уровни проверки для обеспечения более строгих ограничений на ваши данные. Обертывание json.loads() или вспомогательные методы API в try...except Блоки защищают остальную часть вашего кода от каскадных сбоев и позволяют вам возвращать результат. удобные для пользователя ошибки JSON клиентам, когда это уместно.

Использование JSON с веб-API в Python

Большинство веб-API, с которыми вы взаимодействуете из Python, будут отправлять и получать данные в формате JSON. а типичный стек разработки объединяет в себе requests библиотека (для HTTP) с json модуль (для парсинга и генерации JSON). Такое сочетание делает интеграцию API очень естественной.

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

Обработка ошибок приобретает особую важность при выполнении сетевых вызовов. Потому что вы можете столкнуться не только с некорректным JSON, но и с таймаутами, ошибками подключения или сбоями на стороне сервера, которые отвечают HTML вместо JSON. Упаковка json.loads() или вспомогательные методы API в try...except Блоки защищают остальную часть вашего кода от каскадных сбоев.

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

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

Связанная статья:
Решено: получить данные веб-страницы как json python
Похожие посты: