paint-brush
कैसे कई गुना जावा में JSON पार्सिंग में क्रांति लाता हैद्वारा@shai.almog
893 रीडिंग
893 रीडिंग

कैसे कई गुना जावा में JSON पार्सिंग में क्रांति लाता है

द्वारा Shai Almog8m2023/05/02
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

जावा (और अन्य स्वरूपों) में JSON को पार्स करना जावास्क्रिप्ट जितना आसान हो सकता है। यह टाइप-सेफ्टी और डीप IDE इंटीग्रेशन को बनाए रखते हुए बहुत कुछ कर सकता है।
featured image - कैसे कई गुना जावा में JSON पार्सिंग में क्रांति लाता है
Shai Almog HackerNoon profile picture

जावा डेवलपर्स ने अक्सर JSON को पार्स करने में आसानी के लिए जावास्क्रिप्ट की कल्पना की है। हालांकि जावा अधिक मजबूती प्रदान करता है, इसमें अधिक काम और बॉयलरप्लेट कोड शामिल होता है। मैनिफोल्ड प्रोजेक्ट के लिए धन्यवाद, जावा में अब JSON फाइलों को पार्स करने और संसाधित करने में जावास्क्रिप्ट को पछाड़ने की क्षमता है।


मैनिफोल्ड जावा के लिए भाषा एक्सटेंशन का एक क्रांतिकारी सेट है जो JSON (और बहुत कुछ ...) को संभालने के तरीके को पूरी तरह से बदल देता है।

मैनिफोल्ड के साथ शुरुआत करना

इस ट्यूटोरियल का कोड मेरे GitHub पेज पर पाया जा सकता है। मैनिफोल्ड अपेक्षाकृत युवा है लेकिन इसकी क्षमताओं में पहले से ही विशाल है। आप उनकी वेबसाइट और स्लैक चैनल पर प्रोजेक्ट के बारे में अधिक जान सकते हैं।


आरंभ करने के लिए, आपको मैनिफोल्ड प्लगइन स्थापित करना होगा, जो वर्तमान में केवल JetBrains IDEs के लिए उपलब्ध है। परियोजना जावा के एलटीएस रिलीज का समर्थन करती है, जिसमें नवीनतम जेडीके 19 भी शामिल है।


हम मार्केटप्लेस में नेविगेट करके और मैनिफोल्ड की खोज करके IntelliJ/IDEAs सेटिंग्स UI से प्लगइन इंस्टॉल कर सकते हैं। प्लगइन यह सुनिश्चित करता है कि आईडीई मेवेन/ग्रेडल प्लगइन द्वारा किए गए काम से टकराए नहीं।

चित्र का वर्णन

मैनिफोल्ड में कई छोटे प्रोजेक्ट होते हैं, जिनमें से प्रत्येक एक कस्टम भाषा एक्सटेंशन प्रदान करता है। आज, हम ऐसे ही एक एक्सटेंशन पर चर्चा करेंगे, लेकिन एक्सप्लोर करने के लिए और भी बहुत कुछ है।

मावेन परियोजना की स्थापना

मैनिफोल्ड प्रदर्शित करने के लिए, हम एक साधारण मेवेन प्रोजेक्ट का उपयोग करेंगे (यह ग्रैडल के साथ भी काम करता है)। हमें पहले उनकी वेबसाइट से वर्तमान मैनिफोल्ड संस्करण को पेस्ट करना होगा और आवश्यक निर्भरताओं को जोड़ना होगा। JSON के लिए मुख्य निर्भरता manifold-json-rt निर्भरता है।


अन्य निर्भरताओं को YAML, XML और CSV समर्थन के लिए जोड़ा जा सकता है। हमें इसे प्रोजेक्ट में pom.xml फ़ाइल में जोड़ना होगा।


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


ध्यान दें कि यदि आप इस कोड को कम करना चाहते हैं, तो ग्रैडल समतुल्य कोड तुलना द्वारा संक्षिप्त है।


इस पंक्ति को गुण अनुभाग में जाने की आवश्यकता है:

 <manifold.version>2023.1.5</manifold.version>


हम जिन निर्भरताओं का उपयोग करते हैं वे ये हैं:

 <dependencies>   <dependency>       <groupId>systems.manifold</groupId>       <artifactId>manifold-json-rt</artifactId>       <version>${manifold.version}</version>   </dependency>


संकलन प्लगइन बॉयलरप्लेट है जो बायटेकोड में मैनिफोल्ड को बुनता है और इसे हमारे लिए सहज बनाता है। यह पोम सेटअप का अंतिम भाग है:

 <build>   <plugins>       <plugin>           <groupId>org.apache.maven.plugins</groupId>           <artifactId>maven-compiler-plugin</artifactId>           <version>3.8.0</version>           <configuration>               <source>19</source>               <target>19</target>               <encoding>UTF-8</encoding>               <compilerArgs>                   <!-- Configure manifold plugin-->                   <arg>-Xplugin:Manifold</arg>               </compilerArgs>               <!-- Add the processor path for the plugin -->               <annotationProcessorPaths>                   <path>                       <groupId>systems.manifold</groupId>                       <artifactId>manifold-json</artifactId>                       <version>${manifold.version}</version>                   </path>               </annotationProcessorPaths>           </configuration>       </plugin>   </plugins> </build>

सेटअप पूर्ण होने के साथ, आइए कोड में गोता लगाएँ।

मैनिफोल्ड के साथ JSON को पार्स करना

हम संसाधन पदानुक्रम के अंतर्गत प्रोजेक्ट निर्देशिका में एक नमूना JSON फ़ाइल रखते हैं। मैंने इस फ़ाइल को src/main/resources/com/debugagent/json/Test.json के अंतर्गत रखा है:

 { "firstName": "Shai", "surname": "Almog", "website": "https://debugagent.com/", "active": true, "details":[ {"key": "value"} ] }


मुख्य कक्षा में, हम मेवेन प्रोजेक्ट को रीफ्रेश करते हैं, और आप देखेंगे कि एक नई टेस्ट क्लास दिखाई देती है। यह वर्ग JSON फ़ाइल के आधार पर मैनिफोल्ड द्वारा गतिशील रूप से बनाया गया है। यदि आप JSON को बदलते हैं और मावेन को रीफ्रेश करते हैं, तो सब कुछ मूल रूप से अपडेट हो जाता है।


यह समझना महत्वपूर्ण है कि मैनिफोल्ड एक कोड जनरेटर नहीं है। यह JSON को संकलित करता है जिसे हमने अभी बायटेकोड में लिखा है।


टेस्ट क्लास कई अंतर्निहित क्षमताओं के साथ आता है, जैसे कि एक प्रकार-सुरक्षित बिल्डर एपीआई जो आपको बिल्डर विधियों का उपयोग करके JSON ऑब्जेक्ट बनाने देता है। आप write() और toJson() विधियों का उपयोग करके नेस्टेड ऑब्जेक्ट भी उत्पन्न कर सकते हैं और JSON को एक स्ट्रिंग में बदल सकते हैं।


इसका मतलब है कि अब हम लिख सकते हैं:

 Test test = Test.builder().withFirstName("Someone") .withSurname("Surname") .withActive(true) .withDetails(List.of( Test.details.detailsItem.builder(). withKey("Value 1").build() )) .build();


जो निम्नलिखित JSON का प्रिंटआउट लेगा:

 {  "firstName": "Someone",  "surname": "Surname",  "active": true,  "details": [    {      "key": "Value 1"    }  ] }


हम इसी तरह कोड का उपयोग करके एक JSON फ़ाइल पढ़ सकते हैं:

 Test readObject = Test.load().fromJson(""" { "firstName": "Someone", "surname": "Surname", "active": true, "details": [ { "key": "Value 1" } ] } """);


लंबी स्ट्रिंग लिखने के लिए Java 15 TextBlock सिंटैक्स के उपयोग पर ध्यान दें। load() विधि एक वस्तु लौटाती है जिसमें JSON पढ़ने के लिए विभिन्न एपीआई शामिल हैं। इस मामले में, इसे String से पढ़ा जाता है लेकिन इसे यूआरएल, फाइल इत्यादि से पढ़ने के लिए एपीआई हैं।


मैनिफोल्ड सीएसवी, एक्सएमएल और वाईएएमएल समेत विभिन्न प्रारूपों का समर्थन करता है, जिससे आप किसी भी बॉयलरप्लेट कोड को लिखे बिना या प्रकार की सुरक्षा का त्याग किए बिना इनमें से किसी भी प्रारूप को उत्पन्न और पार्स कर सकते हैं। उस समर्थन को जोड़ने के लिए, हमें pom.xml फ़ाइल में अतिरिक्त निर्भरताएँ जोड़ने की आवश्यकता होगी:

   <dependency>       <groupId>systems.manifold</groupId>       <artifactId>manifold-csv-rt</artifactId>       <version>${manifold.version}</version>   </dependency>   <dependency>       <groupId>systems.manifold</groupId>       <artifactId>manifold-xml-rt</artifactId>       <version>${manifold.version}</version>   </dependency>   <dependency>       <groupId>systems.manifold</groupId>       <artifactId>manifold-yaml-rt</artifactId>       <version>${manifold.version}</version>   </dependency> </dependencies>


इन अतिरिक्त निर्भरताओं के साथ, यह कोड JSON फ़ाइल के समान डेटा प्रिंट करेगा... test.write().toCsv() के साथ आउटपुट होगा:

 "firstName","surname","active","details" "Someone","Surname","true","[manifold.json.rt.api.DataBindings@71070b9c]"


ध्यान दें कि अल्पविराम से अलग किए गए मान (CSV) आउटपुट में पदानुक्रम जानकारी शामिल नहीं होती है। यह सीएसवी प्रारूप की एक सीमा है और मैनिफोल्ड की गलती नहीं है।


test.write().toXml() के साथ आउटपुट परिचित और आश्चर्यजनक रूप से संक्षिप्त है:

 <root_object firstName="Someone" surname="Surname" active="true">  <details key="Value 1"/> </root_object>


test.write().toYaml() के साथ हम फिर से एक परिचित प्रिंटआउट प्राप्त करते हैं:

 firstName: Someone surname: Surname active: true details: - key: Value 1

JSON स्कीमा के साथ कार्य करना

मैनिफोल्ड JSON स्कीमा के साथ सहजता से काम करता है, जिससे आप सख्त नियम और प्रतिबंध लागू कर सकते हैं। तारीखों और गणनाओं के साथ काम करते समय यह विशेष रूप से उपयोगी होता है।


मैनिफोल्ड मूल रूप से स्कीमा का पालन करने वाले बाइट कोड को बनाता/अपडेट करता है, जिससे जटिल JSON डेटा के साथ काम करना बहुत आसान हो जाता है।


इस स्कीमा को मैनिफोल्ड गिटहब प्रोजेक्ट से कॉपी और पेस्ट किया गया है:

 { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "http://example.com/schemas/User.json", "type": "object", "definitions": { "Gender": { "type": "string", "enum": ["male", "female"] } }, "properties": { "name": { "type": "string", "description": "User's full name.", "maxLength": 80 }, "email": { "description": "User's email.", "type": "string", "format": "email" }, "date_of_birth": { "type": "string", "description": "Date of uses birth in the one and only date standard: ISO 8601.", "format": "date" }, "gender": { "$ref" : "#/definitions/Gender" } }, "required": ["name", "email"] }


यह अपेक्षाकृत सरल स्कीमा है, लेकिन मैं आपका ध्यान यहां कई चीजों की ओर दिलाना चाहता हूं। यह आवश्यकतानुसार नाम और ईमेल को परिभाषित करता है। यही कारण है कि जब हम मैनिफोल्ड में एक बिल्डर का उपयोग करके एक User ऑब्जेक्ट बनाने की कोशिश करते हैं, तो build() विधि को दोनों मापदंडों की आवश्यकता होती है:

 User.builder("Name", "[email protected]")


यह तो बस शुरुआत है... स्कीमा में एक तारीख शामिल है। जेएसओएन में तिथियां एक दर्दनाक संभावना हैं, मानकीकरण खराब है और मुद्दों से भरा है। स्कीमा में एक लिंग क्षेत्र भी शामिल है जो प्रभावी रूप से एक गणना है।


यह सभी सामान्य जावा कक्षाओं जैसे कि लोकलडेट का उपयोग करके टाइप-सुरक्षित शब्दार्थ में परिवर्तित हो जाता है:

 User u = User.builder("Name", "[email protected]")       .withDate_of_birth(LocalDate.of(1999, 10, 11))       .withGender(User.Gender.male)       .build();


स्थिर आयात के साथ इसे और भी छोटा बनाया जा सकता है, लेकिन विचार का सार स्पष्ट है। JSON मैनिफोल्ड में प्रभावी रूप से जावा का मूल निवासी है।

बर्फ की चट्टान का कोना

मैनिफोल्ड एक शक्तिशाली और रोमांचक परियोजना है। यह जावा में JSON पार्सिंग में क्रांति लाता है, लेकिन यह क्या कर सकता है इसका सिर्फ एक छोटा सा हिस्सा है!


हमने इस पोस्ट में केवल इसकी क्षमताओं की सतह को खंगाला है। अगले लेख में, हम मैनिफोल्ड में गहराई से जाएंगे और कुछ अतिरिक्त अनपेक्षित सुविधाओं का पता लगाएंगे।


कृपया टिप्पणी अनुभाग में मैनिफोल्ड के बारे में अपना अनुभव और विचार साझा करें। यदि आपके कोई प्रश्न हैं, तो पूछने में संकोच न करें।