Tôi đang chạy Python 2.7 và tôi đang cố gắng tạo lớp con FloatEncoder tùy chỉnh của JSONEncoder. Tôi đã làm theo nhiều ví dụ như this nhưng không có ví dụ nào hoạt động. Đây là lớp FloatEncoder tôi:Tạo JSONEncoder tùy chỉnh
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)
Và đây là nơi tôi gọi 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)
Khẳng định đầu tiên thất bại, có nghĩa là _iterencode không được thực thi. Sau khi đọc tài liệu JSON, tôi đã cố gắng ghi đè phương thức default() nhưng cũng không được gọi.
FWIW, 'mặc định()' không được gọi vì nếu đầu vào là một trong những loại bộ mã hóa hỗ trợ theo mặc định, nó sẽ thậm chí không nhìn vào phương pháp tùy chỉnh của bạn. So sánh 'lib/json/encoder.py', trong định nghĩa' _iterencode() ':' _default() 'chỉ được gọi trong nhánh' else: ', sau khi tất cả các kiểu đã biết đã được bảo hiểm. Do đó bạn không thể ghi đè lên xử lý cho một loại đã biết. – Tomalak