YamlBox

कोड जनरेटर · 5 मिनट पढ़ें

JSON जाने के लिए: ऐसी संरचनाएं जो पहले प्रयास में अनमर्शल हो

गो आपको उस JSON के आकार को लिखने देता है जिसे आप डिकोड कर रहे हैं, और कंपाइलर आपको उस पर रखता है। वास्तविक प्रतिक्रिया से JSON टू गो रूपांतरण टाइपिंग और अनुमान दोनों को हटा देता है: फ़ील्ड नाम, `json` टैग और नेस्टेड प्रकार सही आते हैं, और आप सीधे प्रोग्राम के उस हिस्से पर जा सकते हैं जो वास्तव में कुछ करता है।

अद्यतन

उत्पन्न आकृति

एक कनवर्टर प्रत्येक JSON ऑब्जेक्ट को एक संरचना में बदल देता है, प्रत्येक सरणी को एक स्लाइस में बदल देता है, और प्रति मान एक गो प्रकार का अनुमान लगाता है। नेस्टेड ऑब्जेक्ट अज्ञात ब्लॉब्स के बजाय नामित प्रकार बन जाते हैं, जो आपके डिकोडिंग कोड के हस्ताक्षर को पढ़ने योग्य रखता है:

                type Container struct {
  Name  string `json:"name"`
  Image string `json:"image"`
  Ports []struct {
    ContainerPort int `json:"containerPort"`
  } `json:"ports"`
}
              

`json` टैग महत्वपूर्ण हिस्सा हैं। फ़ील्ड नामों का मिलान करते समय गो का डिकोडर केस-असंवेदनशील होता है, लेकिन `containerPort` और `ContainerPort` टैग के बिना संरेखित नहीं होते हैं, और कोई भी कुंजी जो वैध गो पहचानकर्ता नहीं है - `app.kubernetes.io/name`, उदाहरण के लिए - एक के बिना बिल्कुल भी मिलान नहीं किया जा सकता है।

संख्याएँ, शून्य और दो क्लासिक जाल

  • संख्याएँ - अनुमान संपूर्ण मानों के लिए `int` उत्पन्न करता है, लेकिन JSON का कोई पूर्णांक प्रकार नहीं होता है। जो क्षेत्र आज `3` है वह कल `3.5` हो सकता है, इसलिए आईडी और पैसा आपकी ज़रूरतों के आधार पर `float64`, `string` या `json.Number` के रूप में अधिक सुरक्षित हैं।
  • शून्य - एक कुंजी जो `null` हो सकती है वह एक सूचक (`*string`) होनी चाहिए ताकि आप "खाली" से "अनुपस्थित" बता सकें।
  • टाइमस्टैम्प - एक RFC 3339 स्ट्रिंग `time.Time` में साफ़-साफ़ डिकोड होती है; एक यूनिक्स युग संख्या नहीं है, इसलिए उन्हें `int64` के रूप में रखें और स्पष्ट रूप से परिवर्तित करें।
  • अज्ञात फ़ील्ड - `json.Decoder` डिफ़ॉल्ट रूप से अतिरिक्त को अनदेखा करता है; `DisallowUnknownFields` का उपयोग तब करें जब आप ज़ोर-ज़ोर से असफल होना चाहें।

जब संभव हो तो दो या तीन प्रतिक्रियाएँ उत्पन्न करें। जो फ़ील्ड कभी-कभी गायब होती हैं वे संकेतक बन जाती हैं, और स्मृति की तुलना में साक्ष्य के आधार पर निर्णय लेना बहुत आसान होता है।

स्ट्रक्चर से लेकर वर्किंग कोड तक

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

स्थानीय स्तर पर उत्पन्न करें

गो स्ट्रक्चर तैयार करने लायक पेलोड आमतौर पर वास्तविक API प्रतिक्रियाएँ होते हैं, और वास्तविक प्रतिक्रियाएँ टोकन और ग्राहक डेटा ले जाती हैं। ब्राउज़र-आधारित JSON टू गो रूपांतरण पेलोड को टैब में रखता है - कोई अपलोड नहीं, कोई अवधारण प्रश्न नहीं - जो उत्पादन डेटा से उत्पादन को नीति अपवाद के बजाय एक सामान्य कदम बनाता है।

JSON जाना - अक्सर पूछे जाने वाले प्रश्न

मेरी Go संरचनाएँ डिकोडिंग JSON क्यों नहीं कर रही हैं?

JSON में फ़ील्ड नाम शायद ही कभी गो के निर्यातित नामों से मेल खाते हों, इसलिए संरचना को `json` टैग की आवश्यकता होती है। सक्षम टैग के साथ पुन: उत्पन्न करें, विराम चिह्न सहित कुंजी वर्तनी की पुष्टि करें, और जांचें कि डिकोडर को अज्ञात फ़ील्ड की अनुमति देनी चाहिए या नहीं।

क्या उत्पन्न संख्यात्मक फ़ील्ड int या फ्लोट64 होनी चाहिए?

जब सटीकता मायने रखती है तो बाहरी API से किसी भी चीज़ के लिए `float64` - या `json.Number` का उपयोग करें, क्योंकि JSON पूर्णांकों को दशमलव से अलग नहीं करता है। उन मूल्यों के लिए `int` आरक्षित रखें जिन्हें आप शुरू से अंत तक नियंत्रित करते हैं।

मैं उस फ़ील्ड को कैसे संभाल सकता हूँ जो कभी-कभी शून्य होती है?

इसे `*string` जैसे सूचक प्रकार बनाएं, जो "कुंजी अनुपस्थित" और "शून्य मान के साथ मौजूद कुंजी" दोनों को एन्कोड करता है, जबकि आपको वास्तविक मान की जांच करने की अनुमति देता है। इसके बजाय गैर-सूचक फ़ील्ड चुपचाप शून्य मान बन जाते हैं।

इस पोस्ट में उल्लिखित उपकरण

19 टूल की पूरी सूची ब्राउज़ करें

पढ़ने के लिए और लेख

6 मिनट पढ़ें

JSON से TypeScript: ऐसे प्रकार जो वास्तविकता से मेल खाते हैं

वास्तविक API प्रतिक्रिया से JSON को TypeScript इंटरफ़ेस में कनवर्ट करें - वैकल्पिक कुंजी, शून्य यूनियन, नेस्टेड प्रकार - और उत्पन्न प्रकारों को बहने से बचाएं।

5 मिनट पढ़ें

JSON से SQL: पेलोड से तालिका तक आप क्वेरी कर सकते हैं

समझदार प्रकार की मैपिंग, एस्केपिंग और ईमानदार सीमाओं के साथ वास्तविक पेलोड से उत्पन्न क्रिएट टेबल और इंसर्ट स्टेटमेंट के साथ JSON को SQL में कनवर्ट करें।

6 मिनट पढ़ें

JSON फ़ॉर्मेटर: सुंदर, छोटा, और वास्तव में मान्य

एक JSON फ़ॉर्मेटर जो सटीक त्रुटि स्थानों के साथ सुंदर-प्रिंट, छोटा और मान्य करता है - साथ ही लगभग हर अमान्य JSON त्रुटि के पीछे पाँच सिंटैक्स गलतियाँ।

सभी 19 पोस्ट →