TATECHATLAS
◎ हिन्दी
प्रोग्रामिंग

डेटा और डिसिमल को JSON में ISO टाइमस्टैम्प स्ट्रिंग्स और डिसिमल स्ट्रिंग्स के रूप में सीरियलाइज़ करें, फिर एक स्पष्ट पाइथन अनुबंध के साथ पुनर्निर्माण करें

ISO टाइमस्टैम्प स्ट्रिंग्स और डिसिमल स्ट्रिंग्स का उपयोग करें, फिर json.loads के बाद नामित फ़ील्ड्स को स्पष्ट रूप से पुनर्निर्माण करें। एक पूर्ण स्टैंडर्ड-लाइब्रेरी उदाहरण टाइमज़ोन चेक्स, प्रिसीजन और प्रेडिक्टेबल फेल्यर्स दिखाता है।

इस पृष्ठ पर

एक कस्टम json.dumps डिफ़ॉल्ट फ़ंक्शन का उपयोग करके टाइमज़ोन-एवर डेटाटाइम्स को ISO स्ट्रिंग्स के रूप में एनकोड करें और फाइनाइट डिसिमल वैल्यूज़ को डिसिमल स्ट्रिंग्स के रूप में। json.loads के बाद नामित फ़ील्ड्स को स्पष्ट रूप में पुनर्निर्माण करें। यह सैंपल टाइमस्टैम्प ऑफसेट और डिसिमल(“12.30”) प्रतिनिधित्व को बनाए रखता है, बिना किसी त्रुटि-रहित स्ट्रिंग्स को टाइप्ड ऑब्जेक्ट्स के रूप में उपचारित किए। उदाहरण दो फ़ील्ड्स को वैलिडेट करता है, नहीं एक पूर्ण बिज़नेस स्कीमा।

इंटरचेंज अनुबंध को परिभाषित करें

JSON के पास कोई डेडिकेटेड डेटाटाइम या डिसिमल टाइप नहीं है। प्रत्येक अतिरिक्त पाइथन टाइप को सीमा पार करने का तरीका परिभाषित करें, पहले एक एनकोडर का चयन करने से पहले। यह गाइड एक विशिष्ट अनुबंध का उपयोग करता है: टाइमस्टैम्प एक ISO स्ट्रिंग है जिसमें एक उपयोगी यूटीसी ऑफसेट शामिल है, और अमाउंट एक फाइनाइट डिसिमल स्ट्रिंग है। एक उपभोक्ता दो फ़ील्ड्स को स्पष्ट रूप से पुनर्निर्माण करता है। न तो एक डेटा-लुकिंग स्ट्रिंग और न ही एक नंबर-लुकिंग स्ट्रिंग स्वचालित रूप से एक टाइप्ड पाइथन ऑब्जेक्ट होता है।

उदाहरण पाइथन स्टैंडर्ड लाइब्रेरी का उपयोग करता है और पाइथन 3.11 या नए संस्करण को टारगेट करता है। इसका कंस्ट्रक्टेड इनपुट सितंबर 29, 2026, को 12:00 बजे का एक यूटीसी डेटाटाइम और डिसिमल(“12.30”) है। उद्देश्य इस प्रतिनिधित्व को बनाए रखना है, नहीं किसी भी त्रुटि-रहित ऑब्जेक्ट्स को सीरियलाइज़ करना या एक पूर्ण भुगतान स्कीमा को परिभाषित करना।

टाइमज़ोन-एवर डेट्स को सीरियलाइज़ करें

एक डेटाटाइम केवल तभी जागरूक होता है जब tzinfo न ही नल और utcoffset() भी एक वैल्यू रिटर्न करता है। एनकोडर दोनों शर्तों को चेक करता है, पहले isoformat() को कॉल करने से पहले। नैव डेटाटाइम्स को रिजेक्ट करना मशीन के लोकल टाइमज़ोन को स्वचालित रूप से असाइन करने या एक लोकल वॉल-क्लॉक रीडिंग को एक विशिष्ट क्षण के साथ भ्रमित करने से बचाता है।

सैंपल यूटीसी टाइमस्टैम्प 2026-09-29T12:00:00+00:00 बन जाता है। एक ऑफसेट स्ट्रिंग उस क्षण पर ऑफसेट को पहचानता है, लेकिन एक IANA ज़ोन नाम या इसके भविष्य के डेलीलाइट-सेविंग रूल्स को नहीं बनाए रखता है। केवल तभी यूटीसी में नॉर्मलाइज़ करें जब वह आपका अनुबंध मिलता है; यह उदाहरण एक नैव टाइमस्टैम्प को यूटीसी के रूप में पुनर्व्याख्यायित नहीं करता है।

डिसिमल को एक स्ट्रिंग के रूप में बनाए रखें

डिसिमल(“12.30”) अपने डिसिमल डिजिट्स और ट्रेलिंग ज़ीरो को बनाए रखता है। इसे सीरियलाइज़ करने से पहले एक बाइनरी फ्लोट में कन्वर्ट करना प्रतिनिधित्व को बदलता है और राउंडिंग लाने में मदद कर सकता है। एनकोडर इसके बजाय str(obj) रिटर्न करता है, जिससे अमाउंट एक JSON स्ट्रिंग बन जाता है। रिसीवर इसे डिसिमल में पुनर्निर्माण कर सकता है, बिना पहले एक फ्लोट से गुजरने के।

उदाहरण नॉन-फाइनाइट डिसिमल वैल्यूज़ को रिजेक्ट करता है। एक डिसिमल स्ट्रिंग अभी भी मुद्रा, एक अधिकतम राशि या अनुमत फ्रैक्शनल डिजिट्स को स्पेसिफाई नहीं करता है। वे अलग-अलग बिज़नेस कंस्ट्रेंट्स हैं। JSON नेटिव नंबर वैल्यूज़ का भी समर्थन करता है; एक डिसिमल स्ट्रिंग का चयन यहां एक स्पष्ट इंटरऑपरेबिलिटी अनुबंध है, नहीं यह दावा कि JSON में नंबर नहीं हो सकते।

एक स्पष्ट एनकोडर बनाएं

पूर्ण उदाहरण में इम्पोर्ट्स, एनकोडिंग, पुनर्निर्माण और सैंपल इनपुट शामिल हैं। json.dumps डिफ़ॉल्ट को केवल उन ऑब्जेक्ट्स के लिए कॉल करता है जिन्हें इसकी नॉर्मल एनकोडर हैंडल नहीं कर सकता। कस्टम फ़ंक्शन डेटाटाइम और डिसिमल हैंडल करता है; अन्य असपोर्टेड कस्टम ऑब्जेक्ट्स टाइपएरर उठाते हैं। ऑर्डिनरी स्ट्रिंग्स, इंटीजर्स, लिस्ट्स और डिक्शनरीज़ बिल्ट-इन एनकोडर की जिम्मेदारी बनी रहती हैं।

allow_nan=False नेटिव फ्लोट NaN और इन्फिनिटी को सीरियलाइज़ेशन के दौरान रिजेक्ट करता है। फाइनाइट डिसिमल चेक अलग है क्योंकि डिसिमल को कस्टम फ़ंक्शन द्वारा हैंडल किया जाता है। किसी थर्ड-पार्टी डिपेंडेंसी की आवश्यकता नहीं है। नीचे का उदाहरण इलस्ट्रेटिव है; इसकी अपेक्षित आउटपुट को एक एक्सीक्यूटेड टेस्ट के रूप में प्रस्तुत किया जाता है, नहीं एक्सप्लेन किया जाता है।

import json
from datetime import datetime, timezone
from decimal import Decimal, InvalidOperation

def contract_encoder(obj):
    if isinstance(obj, datetime):
        if obj.tzinfo is None or obj.utcoffset() is None:
            raise TypeError("Timezone-aware datetime required")
        return obj.isoformat()
    if isinstance(obj, Decimal):
        if not obj.is_finite():
            raise TypeError("Finite Decimal required")
        return str(obj)
    raise TypeError("Unsupported custom value")

def reconstruct_data(data):
    if not isinstance(data, dict):
        raise ValueError("Object required")
    if not all(isinstance(data.get(key), str) for key in ("timestamp", "amount")):
        raise ValueError("timestamp and amount must be strings")
    timestamp = datetime.fromisoformat(data["timestamp"])
    if timestamp.tzinfo is None or timestamp.utcoffset() is None:
        raise ValueError("Timezone-aware timestamp required")
    amount = Decimal(data["amount"])
    if not amount.is_finite():
        raise ValueError("Finite amount required")
    return {"timestamp": timestamp, "amount": amount}

data = {"timestamp": datetime(2026, 9, 29, 12, 0, tzinfo=timezone.utc),
        "amount": Decimal("12.30")}
encoded = json.dumps(data, default=contract_encoder, allow_nan=False)
print(encoded)
restored = reconstruct_data(json.loads(encoded))
print(restored["timestamp"].isoformat(), str(restored["amount"]))

फ़ील्ड्स को वापस पढ़ें

json.loads डिक्शनरीज़, लिस्ट्स और बेसिक वैल्यूज़ को पुनर्निर्माण करता है। यह टाइमस्टैम्प और अमाउंट को स्ट्रिंग्स के रूप में छोड़ देता है। reconstruct_data चेक करता है कि टॉप-लेवल वैल्यू एक ऑब्जेक्ट है और दोनों आवश्यक फ़ील्ड्स स्ट्रिंग्स हैं, फिर datetime.fromisoformat और Decimal स्पष्ट रूप से कॉल करता है। यह एक उपयोगी टाइमस्टैम्प ऑफसेट और एक फाइनाइट अमाउंट की भी आवश्यकता है।

हर स्ट्रिंग को डेटा या नंबर के रूप में कन्वर्ट न करें। फ़ील्ड का अर्थ एक सहमति स्कीमा से आता है। ये चेक्स दो फ़ील्ड्स को कवर करते हैं; वे हर अतिरिक्त प्रॉपर्टी को रिजेक्ट नहीं करते और एप्लिकेशन साइज़, मुद्रा, अधिकृत और रेंज पॉलिसीज़ को एनफोर्स नहीं करते। एप्लिकेशन को अपने बाउंडरी पर वास्तव में आवश्यक कंस्ट्रेंट्स जोड़ने चाहिए।

इलस्ट्रेटिव आउटपुट का निरीक्षण करें

कंस्ट्रक्टेड इनपुट के लिए, पहला प्रिंटेड लाइन है {“timestamp”: “2026-09-29T12:00:00+00:00”, “amount”: “12.30”}। दूसरा है 2026-09-29T12:00:00+00:00 12.30। ये इलस्ट्रेटिव अपेक्षित लाइनें हैं जो कोड से निकाली गई हैं, नहीं एक एक्सीक्यूटेड टेस्ट की रिपोर्ट। पुनर्निर्माण के बाद अमाउंट JSON में क्वोटेड है और अभी भी एक ज़ीरो पर समाप्त होता है।

टाइप्ड पुनर्निर्माण वैल्यूज़ को आपकी इंटेंडेड अनुबंध के साथ तुलना करें। एक डिकोडेड स्ट्रिंग अकेले यह साबित नहीं करता है कि पुनर्निर्माण हुआ था। आउटपुट अनुबंध को एक टैग्ड ऑब्जेक्ट या एक नंबरिक JSON अमाउंट में बदलने के लिए उपभोक्ताओं में संबद्ध परिवर्तनों की आवश्यकता होगी; अनजाने में फॉर्मेट्स को मिक्स न करें।

अवैध वैल्यूज़ को पूर्वानुमेय रूप से हैंडल करें

एक नैव टाइमस्टैम्प, एक नॉन-फाइनाइट डिसिमल या किसी अन्य असपोर्टेड कस्टम ऑब्जेक्ट को एनकोडिंग करने से उदाहरण में स्पष्ट टाइपएरर उठाया जाता है। बिगड़े हुए JSON से json.JSONDecodeError उठा सकता है। अवैध ISO टाइमस्टैम्प टेक्स्ट से वैल्यूएरर उठा सकता है। अवैध डिसिमल टेक्स्ट नॉर्मल रूप से डिफ़ॉल्ट डिसिमल कॉन्टेक्स्ट के तहत decimal.InvalidOperation उठाता है, नहीं वैल्यूएरर।

पुनर्निर्माण चेक्स गलत टॉप-लेवल टाइप, मिसिंग या नॉन-स्ट्रिंग फ़ील्ड्स, एक ऑफसेट-फ्री टाइमस्टैम्प और एक नॉन-फाइनाइट अमाउंट के लिए वैल्यूएरर उठाते हैं। डिसिमल ट्रैप्स कंफिगरेबल हैं, इसलिए एक्सेप्शन व्यवहार कॉन्टेक्स्ट पर निर्भर कर सकता है। एप्लिकेशन बाउंडरी पर संबंधित फेल्यर्स को हैंडल करें, बिना सार्वभौमिक ट्रेसेबैक वर्डिंग या सेंसिटिव पेलोड्स को लॉग करने के वादे किए।

जानें कि JSON क्या नहीं बनाए रख सकता

JSON यह याद नहीं रखता है कि एक एरे एक ट्यूपल या लिस्ट के रूप में उत्पन्न हुआ था, या एक स्ट्रिंग एक डेटाटाइम या डिसिमल के रूप में उत्पन्न हुआ था। स्पष्ट पुनर्निर्माण इस अनुबंध का हिस्सा है। डिफ़ॉल्ट से एक स्ट्रिंग रिटर्न करना यहां पर्याप्त है; कस्टम JSONEncoder और JSONDecoder सबक्लासेस वैकल्पिक विकल्प हैं, नहीं अनिवार्य आवश्यकताएं।

object_hook को डिकोडेड JSON ऑब्जेक्ट्स के लिए कॉल किया जाता है, नहीं हर प्राइमिटिव स्ट्रिंग के लिए। यह एक स्पष्ट रूप से डिज़ाइन किए गए टैग्ड-ऑब्जेक्ट फॉर्मेट का समर्थन कर सकता है, लेकिन वह दो नामित स्ट्रिंग फ़ील्ड्स का उपयोग करने वाले इस अनुबंध से अलग अनुबंध होगा। प्रतिनिधित्व बनाए रखना उपयोगी है, फिर भी यह बिज़नेस वैलिडिटी, नामित टाइमज़ोन रूल्स या सुरक्षित रिसोर्स कन्स्यूम्प्शन को स्थापित नहीं करता है।

क्या जाँचें

  • इस उदाहरण के लिए पाइथन 3.11 या नए संस्करण का उपयोग करें।
  • एक डेटाटाइम को स्वीकार करने से पहले tzinfo और utcoffset() चेक करें।
  • डिसिमल अमाउंट को एक फ्लोट में कन्वर्ट करने के बजाय एक JSON स्ट्रिंग के रूप में बनाए रखें।
  • पुनर्निर्माण के दौरान एक ऑब्जेक्ट के साथ स्ट्रिंग टाइमस्टैम्प और अमाउंट फ़ील्ड्स की आवश्यकता होनी चाहिए।
  • ऑफसेट-फ्री टाइमस्टैम्प्स और नॉन-फाइनाइट अमाउंट्स को रिजेक्ट करें।
  • इनपुट बाउंडरी पर वैल्यूएरर, json.JSONDecodeError और decimal.InvalidOperation के बीच अंतर करें।

यह एक कंस्ट्रक्टेड स्टैंडर्ड-लाइब्रेरी इलस्ट्रेशन है, नहीं एक एक्सीक्यूटेड टेस्ट। ऑफसेट स्ट्रिंग्स नामित टाइमज़ोन रूल्स को नहीं बनाए रखते। डिसिमल स्ट्रिंग्स प्रतिनिधित्व को बनाए रखते हैं, नहीं मुद्रा या बिज़नेस वैलिडिटी। उदाहरण दो फ़ील्ड्स और फाइनाइटनेस को वैलिडेट करता है; एप्लिकेशन को अभी भी रेंज, साइज़ और अधिकृत पॉलिसीज़ की आवश्यकता है।

स्रोत

  1. Python: JSON encoders and decoders ↗
  2. Python: datetime ISO serialization ↗
  3. Python: Decimal arithmetic ↗
ऊपर जाएँ ↑