Estoy ejecutando Python 2.7 y estoy tratando de crear una subclase FloatEncoder personalizada de JSONEncoder. He seguido muchos ejemplos, como this, pero ninguno parece funcionar. Aquí está mi clase FloatEncoder:Creando JSONEncoder personalizado
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)
Y aquí es donde yo llamo 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)
La primera aserción falla, lo que significa que no está siendo ejecutado _iterencode. Después de leer la documentación de JSON, intenté sobreescribir el método predeterminado() pero tampoco fue invocado.
Fwiw, 'por defecto()' no se está llamando porque si la entrada es uno de los tipos del codificador soporta por defecto, ni siquiera mirar a su método personalizado. Compare 'lib/json/encoder.py', en la definición de' _iterencode() ': El' _default() 'solo se llama en la rama' else: ', después de que se hayan cubierto todos los tipos conocidos. Por lo tanto, no puede anular el manejo de un tipo conocido. – Tomalak