我使用的是标准 json module在 python 2.6 中序列化 float 列表。但是,我得到的结果是这样的:
>>> import json
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
我希望 float 的格式只包含两位小数。输出应如下所示:
>>> 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)
这适用于唯一的 float 对象:
>>> json.dumps(23.67, cls=MyEncoder)
'23.67'
但嵌套对象失败:
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
我不想有外部依赖,所以我更愿意坚持使用标准的 json 模块。
我怎样才能做到这一点?
请您参考如下方法:
注意:这在任何最新版本的 Python 中都不有效。
不幸的是,我相信你必须通过猴子补丁来做到这一点(在我看来,这表明标准库 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,这样如果您愿意, float 的每个表示都在您的控制之下;但不幸的是,json 包不是这样设计的。
