我正在使用python 2.6中的标准json模块来序列化浮点列表。但是,我得到这样的结果:
>>> 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 Encoder类:
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软件包中存在设计缺陷)。例如,此代码:
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包装的设计方式:-(。
FLOAT_REPR