জাভা বিকাশকারীরা প্রায়শই জাভাস্ক্রিপ্টকে JSON পার্স করার সহজতার জন্য ঈর্ষা করে। যদিও জাভা আরও দৃঢ়তা প্রদান করে, এটি আরও কাজ এবং বয়লারপ্লেট কোড জড়িত থাকে। ম্যানিফোল্ড প্রকল্পের জন্য ধন্যবাদ, জাভা এখন JSON ফাইলগুলি পার্সিং এবং প্রক্রিয়াকরণে জাভাস্ক্রিপ্টকে ছাড়িয়ে যাওয়ার সম্ভাবনা রয়েছে৷
ম্যানিফোল্ড হল জাভার ভাষার এক্সটেনশনের একটি বিপ্লবী সেট যা JSON (এবং আরও অনেক কিছু...) পরিচালনা করার পদ্ধতিকে সম্পূর্ণরূপে পরিবর্তন করে।
এই টিউটোরিয়ালের কোডটি আমার GitHub পৃষ্ঠায় পাওয়া যাবে। ম্যানিফোল্ড তুলনামূলকভাবে অল্প বয়স্ক কিন্তু ইতিমধ্যেই এর ক্ষমতা ব্যাপক। আপনি তাদের ওয়েবসাইট এবং স্ল্যাক চ্যানেলে প্রকল্প সম্পর্কে আরও জানতে পারেন।
শুরু করার জন্য, আপনাকে ম্যানিফোল্ড প্লাগইন ইনস্টল করতে হবে, যা বর্তমানে শুধুমাত্র JetBrains IDE-এর জন্য উপলব্ধ। প্রকল্পটি সর্বশেষ JDK 19 সহ জাভার LTS রিলিজ সমর্থন করে।
আমরা মার্কেটপ্লেসে নেভিগেট করে এবং ম্যানিফোল্ড অনুসন্ধান করে IntelliJ/IDEAs সেটিংস UI থেকে প্লাগইনটি ইনস্টল করতে পারি। প্লাগইন নিশ্চিত করে যে আইডিই Maven/Gradle প্লাগইন দ্বারা করা কাজের সাথে সংঘর্ষে লিপ্ত না হয়।
ম্যানিফোল্ড একাধিক ছোট প্রকল্প নিয়ে গঠিত, প্রতিটি একটি কাস্টম ভাষা এক্সটেনশন অফার করে। আজ, আমরা এমন একটি এক্সটেনশন নিয়ে আলোচনা করব, তবে আরও অনেক কিছু অন্বেষণ করতে হবে।
ম্যানিফোল্ড প্রদর্শন করতে, আমরা একটি সাধারণ মাভেন প্রকল্প ব্যবহার করব (এটি গ্রেডলের সাথেও কাজ করে)। আমাদের প্রথমে তাদের ওয়েবসাইট থেকে বর্তমান ম্যানিফোল্ড সংস্করণ পেস্ট করতে হবে এবং প্রয়োজনীয় নির্ভরতা যোগ করতে হবে। JSON-এর প্রধান নির্ভরতা হল manifold-json-rt
নির্ভরতা।
YAML, XML, এবং CSV সমর্থনের জন্য অন্যান্য নির্ভরতা যোগ করা যেতে পারে। আমাদের এটিকে প্রকল্পের pom.xml
ফাইলে যোগ করতে হবে।
আমি বিড়ম্বনা সম্পর্কে সচেতন যেখানে JSON-এর জন্য বয়লারপ্লেট হ্রাস Maven বিল্ড স্ক্রিপ্টে প্রচুর কনফিগারেশন দিয়ে শুরু হয়। কিন্তু এটি কনফিগারেশন, "প্রকৃত কোড" নয়; এটি বেশিরভাগই কপি এবং পেস্ট।
লক্ষ্য করুন যে আপনি যদি এই কোডটি কমাতে চান তবে Gradle সমতুল্য কোডটি তুলনামূলকভাবে তির্যক।
এই লাইনটি বৈশিষ্ট্য বিভাগে যেতে হবে:
<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 ফাইলকে রিসোর্স হায়ারার্কির অধীনে প্রোজেক্ট ডিরেক্টরিতে রাখি। আমি এই ফাইলটি src/main/resources/com/debugagent/json/Test.json
এর অধীনে রেখেছি:
{ "firstName": "Shai", "surname": "Almog", "website": "https://debugagent.com/", "active": true, "details":[ {"key": "value"} ] }
মূল ক্লাসে, আমরা Maven প্রজেক্ট রিফ্রেশ করি, এবং আপনি লক্ষ্য করবেন একটি নতুন টেস্ট ক্লাস প্রদর্শিত হচ্ছে। এই ক্লাসটি JSON ফাইলের উপর ভিত্তি করে ম্যানিফোল্ড দ্বারা গতিশীলভাবে তৈরি করা হয়েছে। আপনি যদি JSON পরিবর্তন করেন এবং Maven রিফ্রেশ করেন, সবকিছু নির্বিঘ্নে আপডেট হয়।
এটা বোঝা গুরুত্বপূর্ণ যে ম্যানিফোল্ড একটি কোড জেনারেটর নয়। এটি JSON কম্পাইল করে যা আমরা সবেমাত্র বাইটকোডে লিখেছি।
টেস্ট ক্লাসটি বিভিন্ন বিল্ট-ইন ক্ষমতা সহ আসে, যেমন একটি টাইপ-সেফ বিল্ডার API যা আপনাকে বিল্ডার পদ্ধতি ব্যবহার করে 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 পড়ার জন্য বিভিন্ন API অন্তর্ভুক্ত থাকে। এই ক্ষেত্রে, এটি একটি String
থেকে পড়া হয় কিন্তু একটি URL, ফাইল, ইত্যাদি থেকে এটি পড়ার জন্য API আছে।
ম্যানিফোল্ড CSV, XML, এবং YAML সহ বিভিন্ন ফর্ম্যাটকে সমর্থন করে, যা আপনাকে কোনও বয়লারপ্লেট কোড না লিখে বা টাইপ নিরাপত্তার ত্যাগ না করেই এই ফর্ম্যাটগুলির যেকোনো একটি তৈরি এবং পার্স করতে দেয়৷ সেই সমর্থন যোগ করার জন্য, আমাদের 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) আউটপুটে অনুক্রমের তথ্য অন্তর্ভুক্ত নয়। এটি 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 স্কিমার সাথে নির্বিঘ্নে কাজ করে, আপনাকে কঠোর নিয়ম এবং সীমাবদ্ধতা প্রয়োগ করার অনুমতি দেয়। তারিখ এবং enums সঙ্গে কাজ করার সময় এটি বিশেষভাবে দরকারী.
ম্যানিফোল্ড নির্বিঘ্নে বাইট কোড তৈরি/আপডেট করে যা স্কিমা মেনে চলে, জটিল 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]")
এটা শুধু শুরু... স্কিমা একটি তারিখ অন্তর্ভুক্ত. তারিখগুলি JSON-এ একটি বেদনাদায়ক সম্ভাবনা, প্রমিতকরণ দুর্বল এবং সমস্যায় পরিপূর্ণ। স্কিমাতে একটি লিঙ্গ ক্ষেত্রও রয়েছে যা কার্যকরভাবে একটি enum।
এই সমস্ত সাধারণ জাভা ক্লাস যেমন LocalDate ব্যবহার করে টাইপ-নিরাপদ শব্দার্থবিদ্যায় রূপান্তরিত হয়:
User u = User.builder("Name", "[email protected]") .withDate_of_birth(LocalDate.of(1999, 10, 11)) .withGender(User.Gender.male) .build();
এটি স্ট্যাটিক আমদানির সাথে আরও ছোট করা যেতে পারে, তবে ধারণাটির সারাংশ পরিষ্কার। JSON কার্যকরভাবে ম্যানিফোল্ডে জাভাতে নেটিভ।
ম্যানিফোল্ড একটি শক্তিশালী এবং উত্তেজনাপূর্ণ প্রকল্প। এটি জাভাতে JSON পার্সিংকে বিপ্লব করে, তবে এটি যা করতে পারে তার একটি ক্ষুদ্র অংশ!
আমরা এই পোস্টে শুধুমাত্র এর ক্ষমতার উপরিভাগ স্ক্র্যাচ করেছি। পরের প্রবন্ধে, আমরা ম্যানিফোল্ডের আরও গভীরে ডুব দেব এবং কিছু অতিরিক্ত অপ্রত্যাশিত বৈশিষ্ট্য অন্বেষণ করব।
মন্তব্য বিভাগে ম্যানিফোল্ড সম্পর্কে আপনার অভিজ্ঞতা এবং চিন্তা শেয়ার করুন. আপনার কোন প্রশ্ন থাকলে, জিজ্ঞাসা করতে দ্বিধা করবেন না।