Десериализация даты и времени с двойным кодированием даты - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь десериализовать значение datetime:

def default(o):
    if type(o) is datetime.date or type(o) is datetime.datetime:
        return o.isoformat()


def get_user_join_date(user):

    return json.dumps(  
        user.date_joined,
        sort_keys=True,
        indent=1,
        default=default
    )

, чтобы использовать его в качестве значения в полезной нагрузке:

def jwt_payload_handler(user, active_site):
    payload = {
        "id": user.id,
        "date": get_user_join_date(user),
        "username": user.username, 
        "role": user.role
    }

Проблема в том, что мое datetime заканчиваетсядвойное кодирование (имеет 2 двойные кавычки)

дата: "" 2018-09-27T12: 32: 17.577000 + 00: 00 ""

Любая идея, почему эточто может происходить и как я могу это решить?

1 Ответ

0 голосов
/ 09 октября 2018

Здесь происходит то, что строка даты кодируется дважды.

Возвращаемым значением get_user_join_date(user) является строка '"2018-09-27T12:32:17.577000+00:00"' (поэтому формат даты и времени в формате ISO заключен в двойные кавычки).

Эта строка помещается в полезную нагрузку и снова выводится в JSON всем, что вы используете для создания токена JWT.

Сокращенный пример того, что вы видите, будет следующим:

import json
import datetime

def default(o):
    if type(o) is datetime.date or type(o) is datetime.datetime:
        return o.isoformat()

print(json.dumps({
    'date': json.dumps(
        datetime.datetime.now(),
        default=default
    )
}))

, который производит вывод, который вы видите:

{"date": "\"2018-10-09T12:53:04.914694\""}

Существует несколько решений этой проблемы:

  1. Самым простым решением этой проблемы было быне использовать json.dumps в get_user_join_date и просто возвращать user.date_joined.isoformat() вместо этого.

  2. Другим решением было бы вернуть user.date_joined из get_user_join_date и как-то передать пользовательский default функция для JSON-кодировщика, используемого всем, что обрабатывает эту полезную нагрузку JWT.

  3. Может также быть возможно просто вернуть объект даты из get_user_join_date, но только если библиотека, которую вы 'Повторное использование достаточно умен, чтобы обрабатывать объект datetimeTS (некоторые из них).

...