Вы получаете Decimal('3.432')
в вашем объекте JSON? Странно ... как?
>>> from decimal import *
>>> import json
>>> json.dumps(Decimal('3.432'))
....
TypeError: Decimal('3.432') is not JSON serializable
В любом случае, если вы используете -десятичную вместо поплавка, вы, вероятно, не хотите терять точность путем преобразования его в поплавок. Если это так, то вы должны управлять процессом самостоятельно, первым гарантируя, что вы сохранить все данные, и дело с тем, что JSON не понимает десятичного типа:
>>> j = json.dumps(str(Decimal('3.000')))
>>> j
'"3.000"'
>>> Decimal(json.loads(j))
Decimal('3.000')
Конечно, если вы не» t действительно заботится о точности (например, если какая-то библиотечная процедура дает вам Decimal), сначала конвертируйте в float, так как JSON справится с этим. Вы все еще не получит -десятичная позже, если вручную конвертировать снова с поплавком, хотя ...
Edit: Девин Jeanpierre указывает на существующую поддержку в json
модуль для декодирования поплавка строки как нечто иное, чем поплавком с parse_float argument для load()
, loads()
и пользовательских JSONDecoders. Хотя это потребует от вас сначала конвертировать Decimals в float при кодировании (потеря точности), это может решить вторую половину проблемы немного более чисто, чем мой более ручной подход выше (обратите внимание, что это применимо ко всем поплавкам в ваших данных JSON). Вы также должны создать JSONEncoder subclass, чтобы выписать цифры для Десятичного числа без предварительной конвертации в float, что позволит избежать потери точности.
Модуль json также может принимать пользовательский конструктор float, который будет принимать входные данные типа «3.1» и преобразовывать, скажем, в Десятичный, а не плавать, но это не будет точно переноситься на другие читатели json. (Это даже объясняется в документации, http://docs.python.org/library/json.html) –
Пакет ijson, по-видимому, анализирует десятичные знаки в объектах Decimal(), даже если значение указано как регулярное десятичное число в файл. – Mittenchops
@ Mittenchops Я не вижу этого поведения на 2.7. json.loads ('3.14159') возвращает значение с плавающей запятой 3.14159. Где вы видите, что вы описываете? –