যারা তৃতীয় পক্ষের গ্রন্থাগারটি ব্যবহার করতে চান না তাদের জন্য ... ইলিয়াস জামারিয়ার উত্তরের একটি সমস্যা হ'ল এটি ভাসতে রূপান্তরিত করে যা সমস্যার মধ্যে পড়তে পারে। উদাহরণ স্বরূপ:
>>> json.dumps({'x': Decimal('0.0000001')}, cls=DecimalEncoder)
'{"x": 1e-07}'
>>> json.dumps({'x': Decimal('100000000000.01734')}, cls=DecimalEncoder)
'{"x": 100000000000.01733}'
JSONEncoder.encode()
পদ্ধতি আক্ষরিক JSON বিষয়বস্তু ফিরে অসদৃশ দেয় JSONEncoder.default()
, যা আপনি (ভাসা মত) একটি JSON- সামঞ্জস্যপূর্ণ টাইপ আসতে হয়েছে যে তারপর স্বাভাবিক ভাবেই এনকোড পায়। সমস্যাটি encode()
হ'ল এটি (সাধারণত) কেবলমাত্র শীর্ষ স্তরে কাজ করে। তবে এটি কিছুটা অতিরিক্ত কাজ (অজগর 3.x) সহ এখনও ব্যবহারযোগ্য:
import json
from collections.abc import Mapping, Iterable
from decimal import Decimal
class DecimalEncoder(json.JSONEncoder):
def encode(self, obj):
if isinstance(obj, Mapping):
return '{' + ', '.join(f'{self.encode(k)}: {self.encode(v)}' for (k, v) in obj.items()) + '}'
if isinstance(obj, Iterable) and (not isinstance(obj, str)):
return '[' + ', '.join(map(self.encode, obj)) + ']'
if isinstance(obj, Decimal):
return f'{obj.normalize():f}' # using normalize() gets rid of trailing 0s, using ':f' prevents scientific notation
return super().encode(obj)
যা আপনাকে দেয়:
>>> json.dumps({'x': Decimal('0.0000001')}, cls=DecimalEncoder)
'{"x": 0.0000001}'
>>> json.dumps({'x': Decimal('100000000000.01734')}, cls=DecimalEncoder)
'{"x": 100000000000.01734}'