首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python JSON序列化Decimal对象

Python JSON序列化Decimal对象
EN

Stack Overflow用户
提问于 2009-12-25 13:00:13
回答 14查看 282.7K关注 0票数 287

我有一个Decimal('3.9')作为对象的一部分,并希望将其编码为一个看起来像{'x': 3.9}的JSON字符串。我不关心客户端的精确度,所以一个浮点型就可以了。

有没有一种好的方法来序列化它?JSONDecoder不接受Decimal对象,事先转换为浮点型会产生{'x': 3.8999999999999999},这是错误的,并且将是带宽的一大浪费。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-12-25 14:43:22

如何实现json.JSONEncoder的子类化

代码语言:javascript
复制
class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(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])
        return super(DecimalEncoder, self).default(o)

然后像这样使用它:

代码语言:javascript
复制
json.dumps({'x': decimal.Decimal('5.5')}, cls=DecimalEncoder)
票数 174
EN

Stack Overflow用户

发布于 2010-06-30 18:34:22

Simplejson 2.1及更高版本原生支持Decimal类型:

代码语言:javascript
复制
>>> json.dumps(Decimal('3.9'), use_decimal=True)
'3.9'

请注意,默认情况下,use_decimalTrue

代码语言:javascript
复制
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
    allow_nan=True, cls=None, indent=None, separators=None,
    encoding='utf-8', default=None, use_decimal=True,
    namedtuple_as_object=True, tuple_as_array=True,
    bigint_as_string=False, sort_keys=False, item_sort_key=None,
    for_json=False, ignore_nan=False, **kw):

所以:

代码语言:javascript
复制
>>> json.dumps(Decimal('3.9'))
'3.9'

希望这个特性能包含在标准库中。

票数 256
EN

Stack Overflow用户

发布于 2010-10-08 03:29:03

我想让每个人都知道,我在运行Python2.6.5的web服务器上尝试了MichałMarczyk的答案,它工作得很好。然而,我升级到了Python2.7,它停止了工作。我试着想出一种方法来编码Decimal对象,这就是我想出来的:

代码语言:javascript
复制
import decimal

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

请注意,这会将小数转换为其字符串表示形式(例如,"1.2300"),转换为a.不丢失有效数字和b.防止舍入错误。

希望这篇文章能帮助那些在Python2.7上遇到问题的人。我测试了它,它似乎工作得很好。如果有人注意到我的解决方案中有任何错误,或者想出了更好的方法,请让我知道。

票数 219
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1960516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档