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

Python to json и обратно

Фото Дэвида Клода на Unsplash, так как javascript object obtation (JSON) стала вездесущим Лангом … Tagged с Python, JSON, API, Rapidjson.

фото Дэвид Клод на Неспособный

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

По умолчанию Python json Модуль поддерживает оба свалка и свалки Методы – более распространенным является свалки – Сбросить объект в строку JSON – все это на основе этого Таблица преобразования – который остротно пропускает DateTime Объекты – самое главное, потому что Спецификация JSON не имеет ссылки на какой -либо конкретный формат даты/времени. Это остается на усмотрение исполнителя, основываясь на том, какой формат им нужен – оставляя кодеров повсюду, выясняя, как делать правильные вещи, – поскольку любые несоответствия даты/времени могут вызвать всевозможные хаосы, если они неправильно проанализированы. Если вы хотите прочитать больше вовремя, проверьте Эта коллекция статей Анкет

Простая демонстрация условия неудачи выглядит так:

>>> import datetime
>>> import json
>>> json.dumps(datetime.datetime.utcnow())
Traceback (most recent call last):
  File "", line 1, in 
  File ".../lib/python3.6/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File ".../lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File ".../lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File ".../3.6.8/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'datetime' is not JSON serializable

И если вы нажмете это и найдете в Интернете, вы найдете всевозможные подходы для решения – общий подход, который можно увидеть Реализация функции что итерация через объект, и если он находит DateTime Значение, преобразовать его в ISO 8601 формат, с datetime.isoformat () Анкет Пример шага конверсии:

>>> json.dumps(datetime.datetime.utcnow().isoformat())
'"2020-04-23T23:36:36.620619"'

Однако тогда это становится пользовательским кодом для итерации через объекты, и иногда нам может потребоваться итерация через глубоко вложенные объекты – например, на странице блога, его сообщения и комментарии в одной полезной нагрузке JSON могут иметь временные метки, которые должны быть итерации, через это обнаружен, преобразован и затем json.dumps () Все это.

Некоторые популярные фреймворки могут обрабатывать это для вас автоматически. Примечаемые вызовы – это структура Django Rest Framework DateTimefield по умолчанию в ISO8601, как и превосходное Pydantic Библиотека (вот реализация под капюшоном ).

Однако часто мы можем не захотеть принимать импорт рамки или полноценную библиотеку, но все же хотим избежать необходимости создавать такие решения, как это-и именно здесь мы можем опираться на проторенные пути от боевиков библиотеки, таких как Рапиджсон Библиотека – и, что более важно, Python Purper в эту библиотеку C -F -Fast Анкет

Рапиджсон

Rapidjson Целью замены замены для нативного Python json Модуль, и позволяет кодере расширить поведение, чтобы поддержать больше поведения с меньшими усилиями. Примечание: Этот пакет должен быть установлен через Python-rapidjson имя пакета.

Имейте в виду: Есть Несколько несовместимости Вы должны знать при использовании Rapidjson – Но большинство реализаций могут не использовать их, на самом деле принуждение "Истинно" Строки до питона Верно Значения на самом деле улучшение!

Поэтому, если бы мы запустили наш пример сверху, заменить json с Rapidjson , мы получаем тот же результат, хотя теперь немного яснее:

>>> import datetime
>>> import rapidjson
>>> rapidjson.dumps(datetime.datetime.utcnow())
Traceback (most recent call last):
  File "", line 1, in 
TypeError: datetime.datetime(2020, 4, 24, 0, 11, 16, 105719) is not JSON serializable

Однако теперь мы можем передать аргумент rapidjson.dumps () Чтобы сообщить это, как мы хотим справиться DateTime экземпляры, как так:

>>> rapidjson.dumps(datetime.datetime.utcnow(), datetime_mode=rapidjson.DM_ISO8601)
'"2020-04-24T00:14:35.531078"'

Вуаля, у нас есть действующая строка ISO8601-форматированной из DateTime С небольшим добавлением!

Я собрал более полный пример полноценной дезиализации и загрузки объекта ниже – не стесняйтесь запускаться, вилка, расширять, экспериментировать с кодом и узнать больше о Другое datetime_mode варианты в Rapidjson Анкет

Наслаждаться!

Оригинал: “https://dev.to/miketheman/python-to-json-and-back-17a4”