【发布时间】:2011-06-20 15:45:52
【问题描述】:
我正在运行 Python 2.7,并且正在尝试创建 JSONEncoder 的自定义 FloatEncoder 子类。我遵循了许多示例,例如this,但似乎没有一个有效。这是我的 FloatEncoder 类:
class FloatEncoder(JSONEncoder):
def _iterencode(self, obj, markers=None):
if isinstance(obj, float):
return (str(obj) for obj in [obj])
return super(FloatEncoder, self)._iterencode(obj, markers)
这里是我调用 json.dumps 的地方:
with patch("utils.fileio.FloatEncoder") as float_patch:
for val,res in ((.00123456,'0.0012'),(.00009,'0.0001'),(0.99999,'1.0000'),({'hello':1.00001,'world':[True,1.00009]},'{"world": [true, 1.0001], "hello": 1.0000}')):
untrusted = dumps(val, cls=FloatEncoder)
self.assertTrue(float_patch._iterencode.called)
self.assertEqual(untrusted, res)
第一个断言失败,意味着 _iterencode 没有被执行。阅读 JSON 文档后,我尝试覆盖 default() 方法,但也没有被调用。
【问题讨论】:
-
FWIW,
default()没有被调用,因为如果输入是编码器默认支持的类型之一,它甚至不会查看您的自定义方法。比较lib/json/encoder.py,在_iterencode()的定义中:_default()只在else:分支中被调用,在所有已知类型都被覆盖之后。因此,您不能覆盖对已知类型的处理。