मुफ्त JSON से Go Struct कन्वर्टर

JSON का विश्लेषण करें और PascalCase फ़ील्ड नामों और json टैग्स के साथ Go struct परिभाषाओं को स्वचालित रूप से उत्पन्न करें ताकि आपके Go कोड में सहज एकीकरण हो सके।

इनपुट और आउटपुट

विकल्प

यह कैसे काम करता है

  1. अपना JSON पेस्ट करें: इनपुट फ़ील्ड में कोई भी JSON ऑब्जेक्ट या नेस्टेड संरचना दर्ज करें।
  2. Go struct प्राप्त करें: सही फ़ील्ड नाम, प्रकार और JSON टैग के साथ समकक्ष Go struct परिभाषा जनरेट होती है।
  3. कॉपी और उपयोग करें: struct कोड कॉपी करें और अपने Go प्रोजेक्ट में पेस्ट करके डेटा डीसीरियलाइज़ करना शुरू करें।

JSON → Go struct कन्वर्टर क्यों इस्तेमाल करें?

जटिल JSON प्रतिक्रियाओं के लिए Go struct हाथ से लिखना थकाऊ और त्रुटि-प्रवण है, विशेष रूप से जब API नेस्टेड ऑब्जेक्ट लौटाता है।

विशेषताएँ

  • नेस्टेड struct जनरेशन: गहराई से नेस्टेड JSON ऑब्जेक्ट नेस्टेड Go struct परिभाषाओं में रूपांतरित होते हैं।
  • प्रकार अनुमान: स्ट्रिंग, संख्याएँ, बूलियन, ऐरे और null मान उचित Go प्रकारों से मेल खाते हैं।
  • JSON टैग: सभी फ़ील्ड में मूल JSON कुंजियों से मेल खाने वाले json:"fieldName" struct टैग शामिल हैं।
  • ऐरे हैंडलिंग: JSON ऐरे सही तत्व प्रकार के साथ Go slices बन जाते हैं।
  • पॉइंटर प्रकार: nullable JSON फ़ील्ड पॉइंटर प्रकारों द्वारा दर्शाए जाते हैं (जैसे *string)।

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

null मान कैसे संभाले जाते हैं?

JSON null फ़ील्ड Go में पॉइंटर प्रकारों में रूपांतरित होते हैं (जैसे *string, *int), जो nil और वास्तविक मान दोनों को दर्शाने की अनुमति देते हैं।

यदि JSON में असंगत प्रकार हों तो क्या?

यदि वही फ़ील्ड JSON ऑब्जेक्ट के बीच विभिन्न प्रकारों के साथ दिखाई देती है, तो कन्वर्टर interface{} का अनुमान लगा सकता है।

क्या यह पूरा डीसीरियलाइज़ेशन कोड जनरेट करता है?

टूल struct परिभाषाएँ जनरेट करता है। डीसीरियलाइज़ करने के लिए, json.Unmarshal(data, &myStruct) या json.NewDecoder(r.Body).Decode(&s) का उपयोग करें।

Go और JSON का संक्षिप्त इतिहास

Go को Google में Rob Pike, Robert Griesemer और Ken Thompson द्वारा नवंबर 2009 में लॉन्च किया गया; encoding/json पैकेज Go 1.0 (मार्च 2012) से पहले मानक लाइब्रेरी में स्थिर हो गया था। Go में JSON पार्सिंग रिफ्लेक्शन पर आधारित है: आप एक struct घोषित करते हैं, फ़ील्ड्स को json:«name» टैग से चिह्नित करते हैं, और json.Unmarshal struct और बाइट्स दोनों पर पार करता है। यह पैटर्न इतना उत्पादक साबित हुआ कि बड़े APIs के लिए हाथ से structs लिखना जल्द ही थकाऊ हो गया। Matt Holt ने 2014 में mholt/json-to-go को केवल-JavaScript टूल के रूप में बनाया (अभी भी mholt.github.io/json-to-go पर मेंटेन है) जो ब्राउज़र में regex-आधारित JSON विश्लेषण का उपयोग करता है। quicktype (David Siegel, 2017) ने इस विचार को 23 भाषाओं तक सामान्यीकृत किया, जिनमें TypeScript, Rust, Swift, Kotlin, Python, Java शामिल हैं। प्रदर्शन-केंद्रित easyjson (Mail.ru, 2016) कंपाइल-टाइम पर marshalling कोड जेनरेट करके रिफ्लेक्शन को छोड़ देता है, जो hot paths के लिए encoding/json से 4-5 गुना तेज़ है। Go 1.18 (मार्च 2022) ने जेनेरिक्स जोड़े, जिसने कुछ marshalling हेल्पर्स को सरल बनाया लेकिन struct tag मुहावरे को नहीं बदला। Go 1.21 (अगस्त 2023) ने प्रयोगात्मक encoding/json/v2 पैकेज जोड़ा (2024 में अभी भी चर्चा में), जिसका लक्ष्य लंबे समय से चली आ रही समस्याओं जैसे मूक प्रकार बेमेल और धीमी रिफ्लेक्शन को ठीक करना है।

Struct बनाम map[string]interface{}: कब क्या समझदारी है

  • ज्ञात आकारों के लिए typed structs जीतते हैं। यदि आप API को नियंत्रित करते हैं या स्थिर schema रखते हैं, तो structs आपको कंपाइल-टाइम फ़ील्ड जाँच, IDE ऑटो-कम्पलीशन और 2-3 गुना तेज़ पार्सिंग देते हैं। struct में json.Unmarshal केवल उन फ़ील्ड्स को छूता है जिन्हें वह पहचानता है, अज्ञात JSON keys को मूक रूप से अनदेखा करता है (जब तक आप decoder.DisallowUnknownFields नहीं कॉल करते)।
  • मनमाने JSON के लिए maps जीतते हैं। map[string]interface{} (या Go 1.18+ में map[string]any) अत्यधिक चर आकारों को संभालता है, कई स्रोतों से webhook पेलोड, प्लगइन कॉन्फ़िगरेशन, MongoDB दस्तावेज़। ट्रेड-ऑफ: प्रत्येक एक्सेस को type assertion चाहिए (data[«age»].(float64)), और संख्याएँ डिफ़ॉल्ट रूप से float64 पर पार्स होती हैं, बड़े पूर्णांकों के लिए परिशुद्धता खो देती हैं।
  • हाइब्रिड: struct में ज्ञात फ़ील्ड्स, map में अज्ञात। पार्सिंग को टालने के लिए json.RawMessage का उपयोग करें या Extra map[string]interface{} `json:«-,inline»` catch-all फ़ील्ड जोड़ें (go-restful जैसी लाइब्रेरीज़ की मदद से)। Stripe और Twilio के Go SDKs पीछे-संगत API प्रतिक्रियाओं के लिए इस पैटर्न का उपयोग करते हैं।
  • प्रदर्शन अंतर। Hot paths (उदा। प्रति सेकंड 10,000 webhook ईवेंट पार्स करना) जेनरेट किए गए marshallers से लाभान्वित होते हैं: easyjson, ffjson, go-json, sonic (ByteDance, 2022, रनटाइम पर मशीन कोड जेनरेट करने के लिए JIT का उपयोग करता है, Go में सबसे तेज़ JSON लाइब्रेरी)। struct-आधारित जेनेरिक पार्सिंग शायद 100-200 MB/s हैंडल करती है; sonic 1-2 GB/s।
  • बड़े JSON के लिए स्ट्रीमिंग। 1 GB का JSON फ़ाइल मेमोरी में फ़िट नहीं होगी। json.Decoder.Token() token-दर-token पढ़ता है। json.Decoder.More() एक बार में एक array element पर चलता है। लॉग फ़ाइलों, बड़े डेटासेट्स, ND-JSON स्ट्रीम्स (प्रति पंक्ति एक JSON ऑब्जेक्ट, OpenSearch, BigQuery, ChatGPT API द्वारा उपयोग किया जाता है) के लिए स्ट्रीमिंग का उपयोग करें।

जहाँ JSON-से-Go कन्वर्शन वास्तविक समय बचाता है

  • REST API एकीकरण। Stripe, GitHub, Slack, Notion सभी गहराई से नेस्टेड JSON लौटाते हैं। एक नमूना प्रतिक्रिया लेकर json-to-go में पेस्ट करना अंतिम struct का 80-90% उत्पन्न करता है। बचाए गए समय को शेष 10% पर खर्च करें (समय प्रारूपों के लिए कस्टम unmarshallers, omitempty शब्दार्थ, वैकल्पिक pointer फ़ील्ड्स)।
  • Webhook हैंडलर्स। एक सामान्य Stripe webhook पेलोड 80-200 फ़ील्ड्स और 3-5 स्तर नेस्टिंग का होता है। Go struct को हाथ से टाइप करने में 30-60 मिनट लगते हैं; json-to-go के माध्यम से नमूना पेलोड पेस्ट करने में 30 सेकंड।
  • कॉन्फ़िगरेशन पार्सिंग। JSON कॉन्फ़िग फ़ाइलें (AWS Lambda, Docker Compose compose.json, devcontainer.json द्वारा TOML पर पसंद किया जाता है) Go structs पर साफ़-साफ़ मैप करती हैं। encoding/json उसी struct के साथ फ़ाइल को पढ़ने और लिखने दोनों को संभालता है।
  • gRPC और Protobuf ब्रिज। जेनरेट किए गए Go protobuf प्रकारों में json टैग शामिल हैं। protobuf और JSON के बीच ट्रांसकोडिंग करते समय (gRPC-Gateway, Buf, Connect), json-to-go JSON wire प्रारूप से Go पक्ष को स्केच करने में मदद करता है।
  • डेटाबेस JSONB कॉलम। PostgreSQL jsonb, MongoDB दस्तावेज़, MySQL JSON कॉलम। database/sql ड्राइवर []byte लौटाता है जिसे आप struct में unmarshal करते हैं। जेनरेटर schema-on-read तालिकाओं के लिए पहले पास को तेज़ करते हैं।
  • परीक्षण के लिए फ़िक्सचर डेटा। असली उत्पादन JSON प्रतिक्रिया परीक्षण फ़िक्सचर बन जाती है। json-to-go assertions के लिए unmarshal करने का struct देता है। testdata/ निर्देशिकाओं (Go में 1.10 से परंपरा) के साथ संयोजित, परीक्षणों को वास्तविकता के करीब रखता है।
  • CSV-से-JSON-से-struct पाइपलाइन। डेटा इंजीनियरिंग कार्यों के लिए: CSV पढ़ें, निरीक्षण के लिए JSON में marshal करें, struct पाने के लिए json-to-go में पेस्ट करें, फिर typed पाइपलाइन लिखें। स्प्रेडशीट से कॉलम प्रकार अनुमान लगाने से कहीं तेज़।

Struct जेनरेशन के बाद आम गलतियाँ

  • time.Time हैंडलिंग भूलना। encoding/json RFC 3339 प्रारूप मानता है (2026-05-13T12:34:56Z)। अधिकांश APIs यह वितरित करते हैं लेकिन कुछ Unix टाइमस्टैम्प्स (Stripe), समय क्षेत्र के बिना ISO (पुराने Microsoft APIs), या कस्टम स्ट्रिंग्स का उपयोग करते हैं। गैर-RFC-3339 के लिए, UnmarshalJSON विधि के साथ कस्टम प्रकार परिभाषित करें।
  • float64 डिफ़ॉल्ट के साथ integer ओवरफ्लो। interface{} में पार्स किया गया JSON नंबर float64 बन जाता है; 2^53 से ऊपर की संख्याएँ परिशुद्धता खो देती हैं। Stripe ग्राहक IDs, Twitter snowflakes, Discord उपयोगकर्ता (सभी 64-बिट) आपके struct में json.Number या int64 की आवश्यकता रखते हैं। interface{} में सुरक्षित पार्सिंग के लिए json.Decoder.UseNumber() का उपयोग करें।
  • omitempty की गलतफहमी। omitempty शून्य मान (खाली स्ट्रिंग, 0, nil pointer, खाली slice/map) होने पर marshal समय पर फ़ील्ड को छोड़ देता है। यह नहीं मतलब «unmarshal पर वैकल्पिक»। मान 0 वाला int फ़ील्ड गायब होने से अप्रभेद्य है; यदि आपको यह जानना है कि API ने फ़ील्ड को छोड़ा या शून्य भेजा, तो *int का उपयोग करें।
  • फ़ील्ड नाम केस बेमेल। Go फ़ील्ड्स को marshal होने के लिए निर्यात (पूँजीकृत) होना चाहिए। डिफ़ॉल्ट JSON नाम Go नाम का शाब्दिक है, इसलिए UserID टैग नहीं होने पर JSON में «UserID» बन जाता है। जेनरेटर Go के PascalCase और JSON के camelCase को पाटने के लिए json:«userId» टैग जोड़ते हैं। टैग भूलने का मतलब है कि आपका कोड «अपने आप के साथ काम करता है» लेकिन बाहरी APIs के विरुद्ध विफल हो जाता है।
  • Pointer प्रकारों का अधिक उपयोग। जेनरेटर सुरक्षा के लिए कभी-कभी *string या *int डिफ़ॉल्ट करते हैं। यह हर एक्सेस को nil जाँच की आवश्यकता बनाता है। यदि API गारंटी देता है कि फ़ील्ड हमेशा मौजूद है (API doc पढ़ें), तो value प्रकार का उपयोग करें और indirection छोड़ें।
  • प्रतिक्रियाओं में असंगत प्रकार। कुछ APIs एक प्रतिक्रिया में tags: []string{«foo»} और दूसरी में स्ट्रिंग के रूप में tags: «foo» लौटाते हैं। शुद्ध कोड जेनरेशन इसे पाट नहीं सकता। दोनों मामलों को संभालने वाला कस्टम UnmarshalJSON लिखें, या interface{} पर वापस जाएँ और परिवर्तनशीलता का दस्तावेज़ करें।
  • अज्ञात फ़ील्ड्स को मूक रूप से छोड़ना। डिफ़ॉल्ट रूप से, json.Unmarshal struct से अनुपस्थित JSON keys को अनदेखा करता है। यह अक्सर bug होता है: API ने फ़ील्ड जोड़ा, आपका कोड नहीं जानता। drift पकड़ने के लिए परीक्षणों में decoder.DisallowUnknownFields() का उपयोग करें; उत्पादन में अनुमत रखें।

अधिक अक्सर पूछे जाने वाले प्रश्न

यह कैनोनिकल mholt/json-to-go से कैसे अलग है?

वही मूल एल्गोरिथम: JSON पार्स करें, प्रत्येक फ़ील्ड के पहले उदाहरण से प्रकार अनुमान लगाएँ, backticks में टैग किए गए फ़ील्ड्स के साथ struct जेनरेट करें। यह कार्यान्वयन आपके ब्राउज़र में पूरी तरह से चलता है बिना analytics या network calls के; कैनोनिकल mholt.github.io/json-to-go पर hosted है, वह भी केवल ब्राउज़र लेकिन अलग domain पर। आउटपुट ~95% इनपुट के लिए मेल खाना चाहिए; एज केस (मिश्रित-प्रकार arrays, गहराई से नेस्टेड anonymous structs) थोड़ा भिन्न हो सकते हैं। यदि आपको सटीक mholt आउटपुट चाहिए, उसका उपयोग करें; यदि आपको गोपनीयता गारंटी चाहिए कि JSON आपकी डिवाइस को कभी नहीं छोड़ता, इसका उपयोग करें।

कुछ फ़ील्ड्स interface{} के रूप में क्यों जेनरेट होते हैं?

तीन सामान्य कारण। पहला, स्रोत JSON में literal null: जेनरेटर अकेले null से उपयोगी प्रकार अनुमान नहीं लगा सकता, इसलिए interface{} पर वापस आता है। एक बार वास्तविक schema जानने पर typed pointer (*string, *int) से बदलें। दूसरा, मिश्रित-प्रकार arrays: [1, «two», true] typed slice नहीं हो सकता। तीसरा, आपके नमूने में पूरी तरह से अनुपस्थित फ़ील्ड, यदि उपलब्ध हो तो अधिक प्रतिनिधि JSON पेस्ट करें। Go 1.18+ में आप interface{} को साफ़-सुथरे alias any से बदल सकते हैं; वे प्रकार स्तर पर समान हैं।

क्या मैं इस struct के माध्यम से JSON को बिना डेटा हानि के round-trip कर सकता हूँ?

आमतौर पर हाँ, चेतावनियों के साथ। encoding/json फ़ील्ड मान संरक्षित करता है लेकिन फ़ील्ड क्रम नहीं (JSON spec कहता है कि फ़ील्ड क्रम महत्वहीन है; Go maps जानबूझकर यादृच्छिक हैं)। संख्यात्मक परिशुद्धता: 2^53 से ऊपर के int64 Go int64 में सुरक्षित रूप से round-trip करते हैं, लेकिन यदि आप float64 में cast करते हैं या JavaScript से गुज़रते हैं (उदा। ब्राउज़र मध्यवर्ती), अंक खो देते हैं। अज्ञात JSON फ़ील्ड्स unmarshal-फिर-remarshal पर मूक रूप से हटा दिए जाते हैं, यदि round-trip निष्ठा महत्वपूर्ण है तो map[string]json.RawMessage catch-all से संरक्षित करें।

मुझे जेनरेटेड struct कोड (easyjson, sonic) का उपयोग encoding/json के बजाय कब करना चाहिए?

डिफ़ॉल्ट encoding/json: 95% सेवाओं के लिए पर्याप्त है और भाषा के साथ शिप होता है। तब easyjson या sonic पर स्विच करें जब आपने profile किया है और JSON marshalling आपके CPU flame graph में कुल समय के >10% पर दिखाई देता है। विशिष्ट स्विच पॉइंट्स: प्रति सेकंड हज़ारों अनुरोध हैंडल करने वाली HTTP सेवाएँ, GB/घंटा निगलने वाले लॉग एग्रीगेटर, वास्तविक समय की धाराएँ। दोनों विकल्प समान struct परिभाषाओं और टैग्स को बनाए रखते हैं, इसलिए आप फ़ील्ड घोषणाएँ बदले बिना उन्हें स्वैप कर सकते हैं।

क्या मेरा JSON किसी सर्वर पर भेजा जाता है?

नहीं। JSON पार्सिंग और Go कोड जेनरेशन दोनों आपके डिवाइस पर JavaScript में चलते हैं। पेस्ट करते समय DevTools में Network टैब खोलें; आप शून्य आउटगोइंग अनुरोध देखेंगे। मालिकाना API प्रतिक्रियाओं, ग्राहक डेटा फ़िक्सचर्स, PII वाले webhook पेलोड्स, और NDA द्वारा कवर की गई किसी भी चीज़ के लिए सुरक्षित।