python - 格式浮动标准json模块

我正在使用python 2.6中的标准json module来序列化一个浮点数列表。但是,我得到了这样的结果:

>>> import json
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'

我希望浮点数的格式只有两位小数。输出应该如下所示:
>>> json.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'

我尝试定义自己的JSON编码器类:
class MyEncoder(json.JSONEncoder):
    def encode(self, obj):
        if isinstance(obj, float):
            return format(obj, '.2f')
        return json.JSONEncoder.encode(self, obj)

这适用于唯一的浮动对象:
>>> json.dumps(23.67, cls=MyEncoder)
'23.67'

但对于嵌套对象失败:
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'

我不想有外部依赖,所以我更喜欢使用标准的JSON模块。
我怎样才能做到这一点?


最佳答案:

不幸的是,我认为您必须通过猴子补丁来实现这一点(我认为,这表明标准库json包中存在设计缺陷)。例如,此代码:

import json
from json import encoder
encoder.FLOAT_REPR = lambda o: format(o, '.2f')

print json.dumps(23.67)
print json.dumps([23.67, 23.97, 23.87])

发射:
23.67
[23.67, 23.97, 23.87]

如你所愿。显然,应该有一种架构化的方法来覆盖FLOAT_REPR以便如果您希望的话,浮动的每个表示都在您的控制之下;但不幸的是,这不是设计json包的方式:(-。