Python JSON 序列化一个 Decimal 对象

新手上路,请多包涵

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

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

原文由 Knio 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 646
2 个回答

子类 json.JSONEncoder 怎么样?

 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)

然后像这样使用它:

 json.dumps({'x': decimal.Decimal('5.5')}, cls=DecimalEncoder)

原文由 Michał Marczyk 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 >>> json.dumps(Decimal('3.9'), use_decimal=True)
'3.9'

注意 use_decimal True

 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):

所以:

 >>> json.dumps(Decimal('3.9'))
'3.9'

希望此功能将包含在标准库中。

原文由 Lukas Cenovsky 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题