Member 13998042 Ответов: 2

Объект типа datetime не является СЕРИАЛИЗУЕМЫМ в формате JSON


как сериализовать объект даты и времени в python api
у меня есть api, который даст вывод json, и я пытаюсь сохранить его как excel с помощью xlsxwriter, и я получаю эту ошибку

Object of type datetime is not JSON serializable





это выход api

Цитата:
"sub_start_date_end_date": [
{
"column_name": "страна",
"column_value": "'США'",
"display_text": "страна",
"end_date": "Пт, 03 сентября 2021 года 00:00:00 GMT",
"start_date": "Чт, 03 сентября 2020 00:00:00 GMT"
}
]


Что я уже пробовал:

@final.route('/start_date-end_date', methods=['GET'])
def subscription_date():
    subscription_id = request.args.get('subscription_id')
    email = request.args.get('email')
    update_query = '''
            query
            '''
    result = db.session.execute(text(update_query), {'a':email})
    final = [dict(i) for i in result]
    excel = json.dumps(final)
    efile = json.load(excel, indent=4, cls=DateTimeEncoder)
    workbook = xlsxwriter.Workbook('myfile.xlsx')
    worksheet = workbook.add_worksheet()
    row = 0
    col = 0

    for key in efile:
        row += 1
        worksheet.write(row, col, key)
        worksheet.write(row, col + 1, efile[key])
        print(workbook)
        workbook.close()
    return{"sub_start_date_end_date":final}

class DateTimeEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (datetime.start_date, datetime.end_date)):
            return obj.isoformat()

2 Ответов

Рейтинг:
0

OriginalGriff

Вы можете посмотреть здесь: Питон сериализации значение типа datetime в формат JSON[^]


Рейтинг:
0

Sandeep Mewara

Как правило, использование json.dumps с помощью специального конвертера.

Метод json.dumps может принимать необязательный параметр default, который, как ожидается, будет функцией. Каждый раз, когда JSON пытается преобразовать значение, которое он не знает, как преобразовать, он будет вызывать функцию, которую мы ему передали. Функция получит соответствующий объект и, как ожидается, вернет представление объекта в формате JSON

Пример:
import json
import datetime
 
d = {
   'name' : 'Foo'
}
print(json.dumps(d))   # {"name": "Foo"}
 
d['date'] = datetime.datetime.now()
 
def myconverter(o):
    if isinstance(o, datetime.datetime):
        return o.__str__()
 
print(json.dumps(d, default = myconverter))    # {"date": "2016-04-08 11:43:36.309721", "name": "Foo"}


В вашем случае вы можете попробовать быстрый способ, например:
excel = json.dumps(final, default=str)
По умолчанию он преобразует все, чего не знает, в строку.

Еще одна ссылка на поиск: Питон сериализации значение типа datetime в формат JSON[^]