उन लोगों के लिए जो तीसरे पक्ष के पुस्तकालय का उपयोग नहीं करना चाहते हैं ... एलियास ज़मरिया के जवाब के साथ एक मुद्दा यह है कि यह फ्लोट में परिवर्तित हो जाता है, जो समस्याओं में चल सकता है। उदाहरण के लिए:
>>> 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}'