@beduin01

Почему в словарь Python попадает лишний параметр?

Мну нужно вытащить данные из БД и превратить в массив json. Вот мой код:

for tr in session.query(MyData).all():
	x = tr.asdict()
	print('as dict: ', x)
	print('print amount: ')
	print(x['amount'])
	print('---------')
	tr_list.append(tr.asdict())

answer = json.dumps(tr_list)


Вот сама ошибка:
print amount: 
5000.00
---------
as dict:  {'amount': Decimal('5000.00'), 'id': 6225148}
print amount: 
5000.00
---------
Can't decode DB answer to JSON. Exception: Decimal('5000.00') is not JSON serializable


Я не могу понять почему когда я обращаюсь к элементу словаря я вижу просто его значение -- `5000.00`, а стоит мне попытаться сереализовать все в JSON, как сразу все обламывается т.к. откуда то вылезает `Decimal('5000.00')`

Метод asdict() взят отсюда https://pythonhosted.org/dictalchemy/#
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Это не лишний параметр. Для хранения денежных сум, для которых недопустимы ошибки округления и переполнения, используется специальный тип Decimal.
Всё, что вы выводите, функция print пытается преобразовывать в строку, а модуль json не знает, корректно ли преобразовывать неизвестный ему тип в строку и выбрасывает исключение.
Можно определить свой энкодер, понимающий Decimal:

import json
from decimal import Decimal

class DecimalEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Decimal):
            return str(obj)
        return super(DecimalEncoder, self).default(obj)


json.dumps(tr_list, cls=DecimalEncoder)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
NeiroNx
@NeiroNx
Программист
Потому что там объект типа Decimal
>>> from decimal import *
>>> Decimal('5000.00')
Decimal('5000.00')
>>> a = Decimal('5000.00')
>>> a.to_eng_string()
'5000.00'
>>>


надо так привести к строковому типу
x['amount'] = x['amount'].to_eng_string()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы