我正在运行Python 2.7,我试图创建一个JSONEncoder的自定义FloatEncoder子类。我遵循了很多例子,如this,但似乎没有任何工作。这里是我FloatEncoder类:创建自定义JSONEncoder
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 ((.0,'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文档之后,我试着覆盖默认的()方法,但那个也没有被调用。
FWIW,默认'()'不会被调用,因为如果输入的是编码器默认支持的类型之一,它甚至不会看你的自定义的方法。在'_iterencode()'的定义中比较'lib/json/encoder.py':'_default()'只在所有已知类型被覆盖之后在'else:'分支中被调用。因此,您无法覆盖已知类型的处理。 – Tomalak