Работа с JSON в Python

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

JSONPython
objectdict
arraylist, tuple
stringstr
numberint, float
trueTrue
falseFalse
nullNone

Пользовательская десериализация при разборе строк 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».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *