我正在運行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