У меня есть Decimal('3.9') как часть объекта, и я хочу закодировать это в строку JSON, которая должна выглядеть как {'x': 3.9}. Меня не волнует точность на стороне клиента, поэтому с плавающей точкой все в порядке.
Есть ли хороший способ сериализовать это? JSONDecoder не принимает десятичные объекты, и предварительное преобразование в значение с плавающей запятой приводит к {'x': 3.8999999999999999} что неправильно и приведет к большой трате пропускной способности.
Переведено автоматически
Ответ 1
Simplejson 2.1 и выше имеет встроенную поддержку десятичного типа:
Надеемся, эта функция будет включена в стандартную библиотеку.
Ответ 2
Я хотел бы, чтобы все знали, что я попробовал ответ Михаила Марчика на своем веб-сервере, на котором работал Python 2.6.5, и он работал нормально. Однако я обновился до Python 2.7, и он перестал работать. Я пытался придумать какой-то способ кодирования десятичных объектов, и вот что я придумал:
Обратите внимание, что это преобразует десятичное число в его строковое представление (например; "1.2300"), чтобы a. не потерять значащие цифры и b. предотвратить ошибки округления.
Надеюсь, это должно помочь всем, у кого возникли проблемы с Python 2.7. Я протестировал это, и, похоже, оно работает нормально. Если кто-нибудь заметит какие-либо ошибки в моем решении или предложит лучший способ, пожалуйста, дайте мне знать.
classDecimalEncoder(json.JSONEncoder): defdefault(self, o): ifisinstance(o, decimal.Decimal): # wanted a simple yield str(o) in the next line, # but that would mean a yield on the line with super(...), # which wouldn't work (see my comment below), so... return (str(o) for o in [o]) returnsuper(DecimalEncoder, self).default(o)