Рубрики
Без рубрики

Модуль Python json

Прежде чем мы погрузимся в модуль Python JSON, давайте разберемся, что такое JSON. JSON (обозначение объектов JavaScript) – это стандартизированный формат, который позволяет

Автор оригинала: Pankaj Kumar.

Прежде чем мы погрузимся в модуль Python JSON, давайте разберемся, что такое JSON. JSON (обозначение объектов JavaScript) – это стандартизированный формат, который позволяет обмениваться данными через Интернет.

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

Встроенный модуль json Python-это интерфейс, который преобразует объекты Python в объекты JSON.

В этом уроке давайте рассмотрим некоторые из наиболее часто используемых методов в модуле json.

Формат объекта JSON

Прежде чем перейти к деталям модуля, давайте разберемся, из чего состоит объект JSON.

На самом деле это очень похоже на словарь Python, где у вас есть набор пар {Ключ: значение} . Единственное небольшое различие заключается в том, что объект JSON имеет открывающую и закрывающую фигурные скобки.

Ниже приведен простой пример объекта JSON

{
    "name": "John",
    "age": 42,
    "married": True,
    "qualifications": ["High School Diploma", "Bachelors"]
}

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

Теперь, когда мы знаем, из чего состоит объект JSON, давайте рассмотрим методы модуля Python json .

Импорт модуля Python json

В Python уже есть готовый модуль json , поэтому нет необходимости устанавливать его с помощью pip.

Чтобы импортировать этот модуль, просто введите

import json

json.dumps() – Создание объекта JSON

Мы можем закодировать объект Python в объект JSON с помощью метода json.dumps () .

Вы можете думать о dumps() как о сериализации объекта Python в объект Python JSON и возврате строки. Это необходимо, если вы хотите передавать данные через Интернет.

Закодированные данные указаны в таблице ниже для различных объектов Python.

объект дикт
массив список, кортеж
строка ул
номер перечисления, производные от int, float, int– и float
истинный Правда
ложный Ложный
нулевой Никто

Это принимает любой объект Python, который может быть сериализован в качестве аргумента, и возвращает строку.

Формат:

json_object = json.dumps(serializable_object)

Здесь serializable_object – это объект Python, такой как список, строка и т. Д., Который Может быть сериализуемым. Это не может быть функция/лямбда и т. Д.

import json

python_object = ['Hello', 'from', 'AskPython', 42]

json_object = json.dumps(python_object)

print(type(json_object), json_object)

Выход

 ["Hello", "from", "AskPython", 42]

Этот метод вызовет TypeError если объект не сериализуем.

>>> import json
>>> a = lambda x : x * 2
>>> a(2)
4
>>> json.dumps(a)
Traceback (most recent call last):
    raise TypeError(f'Object of type {o.__class__.__name__}
TypeError: Object of type function is not JSON serializable

Сортировка ключей словаря

Если мы передаем словарь Python в json.dumps() , мы можем указать другой параметр sort_keys , который сделает объект Python json отсортированным по ключам.

import json

dict_obj = {1:"one", 20: "twenty", 5:"five"}

json_obj = json.dumps(dict_obj, sort_keys = True)

print(json_obj)

Выход

{"1": "one", "5": "five", "20": "twenty"}

Наш вывод действительно имеет отсортированные ключи.

ПРИМЕЧАНИЕ : числа преобразуются в строки, так как они закодированы в JSON. Он будет правильно десериализован обратно в целые числа при использовании соответствующих методов.

Довольно печать объектов Python JSON

Мы можем использовать indent параметр json.dumps() для указания уровня отступа. Обычно отступ сделает вывод действительно хорошим.

import json

dict_obj = {1:"one", 20: "twenty", 5:"five"}

json_obj = json.dumps(dict_obj, sort_keys = True, indent = 4)

print(json_obj)

Выход

{
    "1": "one",
    "5": "five",
    "20": "twenty"
}

json.dump() – Дамп в файл

Мы также можем сбросить объект в файл, если вы хотите использовать его позже, используя другой метод json.dump() .

Формат :

json.dump(data, file_object)

Метод json.dump() принимает данные и записывает их в файловый объект.

Таким образом, вы можете открыть новый файл и записать в этот файл объект с помощью json.dump()

import json

python_object = ['Hello', 'from', 'AskPython', 42]

with open("sample.json", "w") as wf:
    json.dump(python_object, wf)

Выход

user@AskPython $ cat sample.json
["Hello", "from", "AskPython", 42]

Как вы можете видеть, объект Python действительно был сброшен в файл.

Теперь давайте возьмем объект JSON, который мы показали в первом примере, и сохраним его в файл.

import json

json_object = {
    "name": "John",
    "age": 42,
    "married": True,
    "qualifications": ["High School Diploma", "Bachelors"]
}

with open("sample.json", "w") as wf:
    json.dump(json_object, wf)

Выход

user@AskPython $ cat sample.json
{"name": "John", "age": 42, "married": true, "qualifications": ["High School Diploma", "Bachelors"]}

Десериализация объектов JSON

Аналогично кодированию объекта Python в объект JSON, мы также можем сделать обратное, преобразовав объект JSON в объект Python. Это называется десериализация .

Мы можем сделать это с помощью методов json.loads() и json.load() , аналогичных json.dumps() и json.dump() .

json.loads()

Это преобразует объект json, закодированный с помощью json.dumps () , обратно в объект Python.

import json

python_object = ['Hello', 'from', 'AskPython', 42]

encoded_object = json.dumps(python_object)

decoded_object = json.loads(encoded_object)

print(type(decoded_object), decoded_object)

Выход

 ['Hello', 'from', 'AskPython', 42]

Мы успешно вернули наш старый объект списка!

json.load() – Десериализация из файла

Это выполняет обратную операцию json.dump() , преобразуя объект json обратно из файла в объект Python.

Давайте возьмем наш файл sample.json и вернем данные с помощью этого метода.

import json

with open("sample.json", "r") as rf:
    decoded_data = json.load(rf)

print(decoded_data)

Выход

{'name': 'John', 'age': 42, 'married': True, 'qualifications': ['High School Diploma', 'Bachelors']}

Действительно, мы снова получили наш старый объект JSON , который мы сохранили в файле!

Теперь, когда мы рассмотрели наиболее часто используемые методы этого модуля, давайте перейдем к следующему шагу: создание собственного кодера JSON!

Создайте свой собственный кодер JSON

Модуль json использует кодер под названием json.JSON Encoder , который использует правила в приведенной выше таблице для кодирования объектов Python.

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

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

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

TypeError: Object of type ndarray is not JSON serializable

Давайте напишем этот класс для сериализации и кодирования массива numpy в объекты json, а также путем преобразования его в список Python в нашем методе default() handler.

import json
import numpy as np

class MyEncoder(json.JSONEncoder):
    # Handles the default behavior of
    # the encoder when it parses an object 'obj'
    def default(self, obj):
        # If the object is a numpy array
        if isinstance(obj, np.ndarray):
            # Convert to Python List
            return obj.tolist()
        else:
            # Let the base class Encoder handle the object
            return json.JSONEncoder.default(self, obj)


# Numpy array of floats
a = np.arange(1, 10, 0.5)
print(type(a), a)

# Pass our encoder to json.dumps()
b = json.dumps(a, cls=MyEncoder)
print(b)

Наконец, мы кодируем его, передавая имя класса параметру cls |/json.dumps() .

Таким образом, вызов кодирования будет:

json_object = json.dumps(python_object, cls=MyEncoder)

Выход

 [1.  1.5 2.  2.5 3.  3.5 4.  4.5 5.  5.5 6.  6.5 7.  7.5 8.  8.5 9.  9.5]
[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5]

Действительно, наш пользовательский кодер теперь может преобразовывать массивы numpy в объекты JSON! Сейчас мы завершили наш первый комплексный кодер.

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

Вывод

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

Рекомендации