Чтобы преобразовать строку данных 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».
