Вы получаете Decimal('3.432')
в вашем объекте JSON? Странно ... как?
>>> from decimal import *
>>> import json
>>> json.dumps(Decimal('3.432'))
....
TypeError: Decimal('3.432') is not JSON serializable
В любом случае, если вы используете десятичное число вместо числа с плавающей точкой, вы, вероятно, не захотите терять точность, преобразовав его в число с плавающей точкой. Если это так, то вам нужно самим управлять процессом, сначала убедившись, что вы сохранили все данные, и учесть тот факт, что JSON не понимает тип Decimal:
>>> j = json.dumps(str(Decimal('3.000')))
>>> j
'"3.000"'
>>> Decimal(json.loads(j))
Decimal('3.000')
Конечно, если вам не очень важна точность (например, если какая-то библиотечная процедура дает вам десятичное число), просто сначала конвертируйте в число с плавающей точкой, поскольку JSON может с этим справиться. Вы по-прежнему не получите десятичную запятую позже, если вы снова не преобразуете вручную из числа с плавающей запятой ...
Редактировать: Девин Жанпьер указывает на существующую поддержку в модуле json
для декодирования строк с плавающей точкой как что-то отличное от float с аргументом parse_float для load()
, loads()
и пользовательские JSONDecoders. Хотя для этого потребуется сначала преобразовать ваши десятичные числа в числа с плавающей точкой при кодировании (теряя точность), это может решить вторую половину проблемы чуть более чисто, чем мой более ручной подход, приведенный выше (обратите внимание, что он будет применяться ко всем числам с плавающей точкой в ваших данных JSON). ). Вы также должны иметь возможность создать подкласс JSONEncoder , чтобы записывать цифры для десятичного числа без предварительного преобразования в число с плавающей точкой, что позволит вам избежать потери точности.