Чтобы преобразовать строку данных JSON в объект Python, используйте метод json.loads()
встроенного пакета json
. Этот метод разбирает предоставленную строку данных JSON и возвращает словарь Python, содержащий все данные из JSON. Вы можете получить обработанные данные из этого словаря, обращаясь к объектам по индексам. Вложенные JSON-объекты также будут обработаны и включены в словарь (см. пример ниже).
Для разбора JSON-файла используйте метод json.load()
(без “s”). В данном примере мы преобразуем строку данных JSON в объект Python.
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
import json json_str = """ { "Customer": "Jason Sweet", "Orders": [ {"Id": 78912}, {"Id": 88953} ] } """'' data = json.loads(json_str) customer = data['Customer'] order_1 = data['Orders'][0]['Id'] order_2 = data['Orders'][1]['Id'] total = len(data['Orders']) print(f"Customer: {customer}, Orders: {order_1}, {order_2}, Total: {total}")
Что такое JSON?
JSON (JavaScript Object Notation) – это облегченный текстовый формат для хранения структурированных данных в удобном для восприятия виде. По сравнению с XML, данные JSON занимают меньше места, их легче читать человеку и обрабатывать компьютеру. JSON часто используется для передачи информации по сети при взаимодействии клиент-сервер и сервер-сервер.
Сам JSON не имеет методов и функций, это просто формат хранения данных. Хотя JSON появился на JavaScript, в настоящее время он активно используется практически во всех языках программирования, включая Python, Java, PHP, C++, C#, Go, причем большинство из них, как и Python, имеют встроенные модули для работы с данными JSON.
{ "Id": 78912, "Customer": "Jason Sweet", "Quantity": 1, "Price": 18.00 }
Что такое десериализация JSON?
Десериализация – это процесс преобразования (декодирования) данных JSON в соответствующие типы данных на используемом языке программирования. Для выполнения этой задачи декодер преобразует данные JSON в словарь Python, используя методы соответствующего модуля парсера JSON.
Модуль json
Python имеет встроенный модуль с названием json (JSON Encoder and Decoder), который упрощает работу с данными в формате JSON в Python.
С помощью модуля JSON Encoder and Decoder вы можете сериализовать (записать) объекты Python в строки JSON или десериализовать (разобрать) строки JSON в объекты Python. Энкодер JSON может создавать красивые или компактные строки JSON, а также конвертировать объекты Python непосредственно в файлы JSON. Декодер JSON может декодировать (или разбирать) строки и файлы JSON в объекты Python.
Вы можете расширить парсер JSON с помощью пользовательских процессоров, передав процессор в метод json.loads()
.
Для работы с JSON в Python необходимо сначала импортировать модуль json
, а затем вызвать метод json.loads()
для разбора строки JSON в объект Python.
import json json_str = '{"Id": 12345}' data = json.loads(json_str) print(data['Id']) # output: 12345
Как JSON Decoder преобразует строку JSON в объект Python?
Парсер JSON может десериализовать как JSON-строки, так и JSON-файлы в объекты Python, используя таблицу преобразований, приведенную ниже. Метод json.load()
принимает необязательный параметр "object_hook"
, который может быть использован для выполнения пользовательской десериализации некоторых JSON-объектов.
JSON | Python |
---|---|
object | dict |
array | list, tuple |
string | str |
number | int, float |
true | True |
false | False |
null | None |
Пользовательская десериализация при разборе строк JSON в объекты Python
Выполнить пользовательскую десериализацию можно, передав функцию десериализации в метод json.loads()
с необязательным параметром "object_hook"
. Функция десериализации будет вызываться для каждого объекта JSON. Результат работы функции будет использоваться для предоставления пользовательского типа Python вместо словаря.
import json class User(object): def __init__(self, id, name): self.id = id self.name = name def user_decoder(obj): return User(obj['id'], obj['name']) json_str = '{"id": 12345, "name": "John Smith"}' user = json.loads(json_str, object_hook=user_decoder) print(f"Id: {user.id}, Name: {user.name}") # output: Id: 12345, Name: John Smith
Исключения, связанные с парсером JSON в Python
Класс JSONDecodeError
является подклассом ValueError
и представляет собой исключения при декодировании строк JSON в объекты Python. Исключение парсера указывает на проблему с целостностью данных JSON. Например, в данных JSON может быть допущена синтаксическая ошибка (пропущена закрывающая фигурная скобка) или ключ без значения (например, {"name": }
).
import json from json.decoder import JSONDecodeError json_str = '{"id": 12345, "name": }' try: user = json.loads(json_str) except JSONDecodeError as exp: print(exp.msg) # output: Expecting value
Синтаксис json.loads()
Метод json.loads()
из модуля JSON Encoder и Decoder выполняет преобразование JSON в Python. Метод json.loads()
принимает строку (а парный метод json.load()
– файловый объект), разбирает данные JSON, преобразует их в соответствующие типы данных Python, заполняет этими данными словарь и возвращает его.
Обратное преобразование из объектов Python в строки JSON выполняется методом json.dumps()
из той же библиотеки.
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
Здесь:
s
– строка, байт или массив байтов, содержащий JSON-документ.object_hook
(необязательный аргумент) – функция, вызываемая декодером при обработке JSON. Позволяет получать пользовательские объекты Python вместо dict.cls
(необязательный аргумент) – класс, содержащий пользовательскую реализацию парсинга JSON, которая будет использоваться вместо стандартного JSONDecoder.parse_float
(необязательный аргумент) пользовательская функция преобразования строки в число с плавающей запятой.parse_int
(необязательный аргумент) – пользовательская функция преобразования строки вint
.parse_constant
(необязательный аргумент) – функция, которая может быть использована для вызова исключения при обнаружении в JSON недопустимых чисел.object_pairs_hook
(необязательный аргумент) – функция, которая будет вызвана для декодирования упорядоченного списка пар и возврата объектов Python вместоdict
. Функцияobject_pairs_hook
имеет более высокий приоритет, чем функцияobject_hook
.
import json json_str = '{"id": 12345, "person": {"name": "John Smith"}}' data = json.loads(json_str) print(f'Name: {data["person"]["name"]}') # output: Name: John Smith
Как разобрать JSON-файл на объекты Python?
Для преобразования JSON-файла в объект Python с помощью JSON Decoder можно использовать метод json.load()
(без “s”), синтаксис которого аналогичен json.loads()
, но вместо строки принимается объект файла.
import json with open('data.json') as file_object: data = json.load(file_object) print(data)
Как получить доступ к элементам массива JSON в словаре Python?
Декодер JSON преобразует массив JSON в словарь Python. Доступ к элементу можно получить по его ключу в словаре.
import json json_str = """ { "Orders": [ {"Id": 78912}, {"Id": 88953} ] } """ data = json.loads(json_str) order_1_id = data['Orders'][0]['Id'] order_2_id = data['Orders'][1]['Id'] total = len(data['Orders']) print(f"Order #1: {order_1_id}, Order #2: {order_2_id}, Total Orders: {total}") # output: Order #1: 78912, Order #2: 88953, Total Orders: 2
Как разобрать JSON-данные из URL в объект Python?
Во-первых, установите библиотеку Python Requests:
pip install requests
Затем с помощью метода requests.get()
загрузите JSON-данные с целевого URL в строку Python. После этого можно использовать метод json.loads()
для преобразования полученной JSON-строки в объект Python.
import json import requests json_str = requests.get("https://reqbin.com/echo/get/json") data = json.loads(json_str.text) print(data) # output: {'success': 'true'}
Как JSON Parser обрабатывает дубликаты ключей в JSON?
RFC 8259 требует, чтобы имя ключа ОБЯЗАТЕЛЬНО было уникальным в JSON, но это не обязательно. Библиотека Python JSON Parser не выбрасывает исключения, связанные с дублированием ключей. Она игнорирует дублирующиеся пары ключ-значение и берет последнюю пару.
import json json_str = '{"key": 1, "key": 2, "key": 3}' data = json.loads(json_str) print(f'Key: {data["key"]}') # output: Key: 3
В чем разница между json.loads() и json.dumps()?
Метод json.dumps()
является противоположностью json.loads()
. Он принимает объект Python и возвращает строку JSON. Метод json.dumps()
может генерировать красивый или компактный JSON в зависимости от переданных параметров.
import json obj = {"Id": 12345, "Quantity": 1, "Price": 18.00} json_str = json.dumps(obj, indent=4) print(json_str)
Результат преобразования Python в JSON:
{ "Id": 12345, "Quantity": 1, "Price": 18.0 }
Перевод статьи «Parsing JSON Strings with Python».