জাভা অবজেক্টকে বিভিন্ন টেক্সট ফরম্যাটে সিরিয়ালাইজ/ডিসারিয়ালাইজ করার জন্য জ্যাকসন একটি জনপ্রিয় লাইব্রেরি। অবজেক্টম্যাপার ক্লাস হল JSON ফর্ম্যাটের সাথে কাজ করার জন্য লাইব্রেরির প্রধান উপায়। অন্যান্য ফরম্যাটের জন্য, আমাদের কাছে এর বংশধর রয়েছে ( XmlMapper , YAMLMapper )। উত্তরাধিকারের জন্য ধন্যবাদ, আমরা একটি একক ইন্টারফেসের মাধ্যমে সব ফরম্যাটের সাথে সামঞ্জস্যপূর্ণভাবে কাজ করতে পারি।

জার ফাইল ডাউনলোড করুন

উদাহরণগুলি অধ্যয়ন করার আগে, আমাদের জ্যাকসন জার ফাইলগুলি ডাউনলোড করতে হবে এবং সেগুলিকে IntelliJ IDEA-তে প্রকল্পের সাথে সংযুক্ত করতে হবে। জ্যাকসন-ডেটাবিন্ডের উদাহরণ নেওয়া যাক কীভাবে প্রয়োজনীয় ফাইলগুলি অনুসন্ধান করা যায়:

  1. ম্যাভেন রিপোজিটরি ওয়েবসাইটে যান ।

  2. অনুসন্ধান বাক্সে " jackson-databind " লিখুন ৷ আপনি নিম্নলিখিত পাবেন:

  3. প্রথম অনুসন্ধানের ফলাফল যা আমরা আগ্রহী তা হল লিঙ্কটি অনুসরণ করুন।

  4. কখনও কখনও একটি প্রকল্পের অন্যান্য উপাদানগুলির সাথে সামঞ্জস্য নিশ্চিত করার জন্য একটি লাইব্রেরির একটি নির্দিষ্ট সংস্করণের প্রয়োজন হতে পারে। সর্বশেষ সংস্করণটি কাজ করা উচিত (এই পাঠটি লেখার সময়, এটি 2.13.2.2)। লিঙ্ক অনুসরণ করুন.

  5. যে পৃষ্ঠাটি খোলে, আপনি "বান্ডেল" লিঙ্কটি চান:

  6. এই লিঙ্কটি ব্যবহার করে জার ফাইলটি ডাউনলোড করুন ।

অনুরূপ পদ্ধতি অনুসরণ করে, আপনি বাকি প্রয়োজনীয় জার ফাইলগুলি খুঁজে পেতে এবং ডাউনলোড করতে পারেন:

সমস্ত প্রয়োজনীয় ফাইল ডাউনলোড করার পরে, সেগুলিকে IntelliJ IDEA-তে প্রকল্পের সাথে সংযুক্ত করুন:

  1. প্রজেক্ট সেটিংস খুলুন (আপনি Ctrl+Alt+Shift+S কী সমন্বয় দিয়ে করতে পারেন)।

  2. লাইব্রেরিতে যান ।

  3. + এবং তারপর "জাভা" টিপুন । ডাউনলোড করা সমস্ত ফাইল নির্বাচন করুন। আমাদের যা শেষ করা উচিত তা এখানে:

  4. এটি আমাদের প্রস্তুতিমূলক কাজ শেষ করে। এখন আমরা অবজেক্টম্যাপারকে অ্যাকশনে ব্যবহার করে দেখতে পারি ।

JSON-এ সিরিয়ালাইজেশন

প্রথমে, আসুন কিছু বস্তুকে JSON-এ সিরিয়ালাইজ করি:


import com.fasterxml.jackson.databind.ObjectMapper;
 
class Book {
	public String title;
	public String author;
	public int pages;
}
 
public class Solution {
	public static void main(String[] args) throws Exception {
    	Book book = new Book();
    	book.title = "Good Omens";
    	book.author = "Pratchett T., Gaiman N.";
    	book.pages = 383;
 
    	ObjectMapper mapper = new ObjectMapper();
    	String jsonBook = mapper.writeValueAsString(book);
    	System.out.println(jsonBook);
	}
}

প্রধান রান করা আপনাকে এই আউটপুট দেবে:

{"title":"গুড ওমেনস","লেখক":"প্র্যাচেট টি., গাইমান এন।","পৃষ্ঠা":383}

অবজেক্টম্যাপারে অনেক উন্নত সেটিংস রয়েছে JSON স্ট্রিংকে আরও পঠনযোগ্য করতে তাদের একটি ব্যবহার করি। তৈরি করার পরঅবজেক্টম্যাপারঅবজেক্ট, এই বিবৃতিটি চালান:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

আউটপুট তথ্য একই রয়ে গেছে, কিন্তু এখন ইন্ডেন্টেশন এবং লাইন বিরতি আছে:

{
  "শিরোনাম" : "গুড ওমেনস",
  "লেখক" : "প্র্যাচেট টি., গাইমান এন।",
 "পৃষ্ঠা" : 383
}

JSON থেকে ডিসিরিয়ালাইজেশন

এখন এর বিপরীত ক্রিয়া করা যাক: আমরা একটি স্ট্রিংকে একটি বস্তুতে ডিসিরিয়ালাইজ করব। প্রোগ্রামটি কী করছে তা দেখতে সক্ষম হতে, আসুন বই ক্লাসে toString পদ্ধতিটি ওভাররাইড করি :


@Override
public String toString() {
	return "Book{" +
        	"title='" + title + '\'' +
        	", author='" + author + '\'' +
        	", pages=" + pages +
        	'}';
}

এবং আমরা প্রধান পদ্ধতিতে নিম্নলিখিতগুলি করব :


public static void main(String[] args) throws Exception {
	String jsonString = "{\"title\":\"Good Omens\",\"author\":\"Pratchett T., Gaiman N.\",\"pages\":383}";
	Book book = new ObjectMapper().readValue(jsonString, Book.class);
	System.out.println(book);
}

আউটপুট:

বই{টাইটেল='গুড ওমেনস', লেখক='প্র্যাচেট টি., গাইমান এন.', পেজ=383}

readValue পদ্ধতিটি ওভারলোড করা হয়েছে — এটিতে অনেক বৈচিত্র রয়েছে যা একটি ফাইল, একটি লিঙ্ক, বিভিন্ন ইনপুট স্ট্রীম ইত্যাদি গ্রহণ করে৷ সরলতার জন্য, আমাদের উদাহরণ একটি ভেরিয়েন্ট ব্যবহার করে যা একটি JSON স্ট্রিং গ্রহণ করে

উপরে উল্লিখিত হিসাবে, ObjectMapper অনেক সেটিংস আছে. চলুন তাদের কয়েক তাকান.

অজানা বৈশিষ্ট্য উপেক্ষা

এমন একটি পরিস্থিতি বিবেচনা করুন যেখানে একটি JSON স্ট্রিং-এর এমন একটি সম্পত্তি রয়েছে যা বুক ক্লাসে বিদ্যমান নেই :


public static void main(String[] args) throws Exception {
	String jsonString = """
        	{
          	"title" : "Good Omens",
          	"author" : "Pratchett T., Gaiman N.",
          	"pages" : 383,
          	"unknown property" : 42
        	}""";
	ObjectMapper mapper = new ObjectMapper();
	Book book = mapper.readValue(jsonString, Book.class);
	System.out.println(book);
}

এই কোডটি কার্যকর করা আমাদের একটি অচেনা সম্পত্তি ব্যতিক্রম দেয় । এটি ডিফল্ট আচরণ, কিন্তু আমরা এটি পরিবর্তন করতে পারি:


ObjectMapper mapper =
new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

একটি তৈরি করার সময়অবজেক্টম্যাপারঅবজেক্ট, আমরা কনফিগার পদ্ধতি ব্যবহার করে সংশ্লিষ্ট সেটিংটিকে false এ সেট করি । কনফিগার পদ্ধতিটি যে অবজেক্টটিতে কল করা হয়েছিল সেটিকে পরিবর্তন করে এবং তারপরে সেই একই অবজেক্টটি ফেরত দেয়, তাই আমরা এই কলটি অন্যভাবে করতে পারি:


ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

কার্যকারিতার ক্ষেত্রে, এই স্বরলিপিটি আগেরটির মতোই।

যদি আমরা এখন মূল পদ্ধতিটি চালাই, ডিসিরিয়ালাইজেশন সফল হবে এবং অজানা সম্পত্তি উপেক্ষা করা হবে।

সুবিধাজনক টীকা

জ্যাকসন আমাদেরকে বেশ কিছু টীকা প্রদান করে যা আমাদেরকে বিভিন্ন উপায়ে সিরিয়ালাইজেশন প্রক্রিয়া কাস্টমাইজ করতে দেয়। আসুন সবচেয়ে দরকারী কিছু এক নজরে দেখে নেওয়া যাক:

@JsonIgnore — এই টীকাটি এমন একটি উপাদানের উপরে রাখা হয়েছে যা সিরিয়ালাইজেশন/ডিসারিয়ালাইজেশনের সময় উপেক্ষা করা উচিত:


class Book {
	public String title;
	@JsonIgnore
	public String author;
	public int pages;
}

এখানেলেখকক্রমিককরণের সময় ক্ষেত্রটি ফলস্বরূপ JSON-এ অন্তর্ভুক্ত করা হবে না। ডিসিরিয়ালাইজেশনের পরে,লেখকক্ষেত্রটি ডিফল্ট মান (নাল) পাবে, এমনকি যদি JSON এর একটি ভিন্ন মান থাকে।

@JsonFormat — এই টীকাটি আপনাকে ক্রমিক ডেটার বিন্যাস সেট করতে দেয়। আসুন বই ক্লাসে আরও একটি ক্ষেত্র, একটি তারিখ যোগ করি :


class Book {
	public String title;
	public String author;
	public int pages;
	public Date createdDate = new Date();
}

ক্রমিককরণের পরে, আমরা নিম্নলিখিত JSON পাই:

 {
  "শিরোনাম" : "গুড ওমেনস",
  "লেখক" : "প্র্যাচেট টি., গাইমান এন।",
  "পৃষ্ঠাগুলি" : 383,
  "তৈরি তারিখ" : 1649330880788
}

আপনি দেখতে পাচ্ছেন, তারিখটি একটি সংখ্যা হিসাবে ক্রমিক করা হয়েছিল। আমরা একটি টীকা যোগ করব এবং বিন্যাস সেট করব:


class Book {
	public String title;
	public String author;
	public int pages;
	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
	public Date createdDate = new Date();
}

এখন সিরিয়ালাইজেশনের ফলাফল হল:

{
  "শিরোনাম" : "গুড ওমেনস",
  "লেখক" : "প্র্যাচেট টি., গাইমান এন।",
  "পৃষ্ঠাগুলি" : 383,
  "তৈরি তারিখ" : "2022-04-07"
}

@JsonProperty — এই টীকাটি আপনাকে ক্রমিক ক্ষেত্রের প্রতিনিধিত্বকারী সম্পত্তির নাম পরিবর্তন করতে দেয়। আপনি এই টীকা দিয়ে পদ্ধতি চিহ্নিত করতে পারেন। যদি আপনি তা করেন, তাহলে সিরিয়ালাইজেশনের সময় তাদের রিটার্ন মান একটি JSON সম্পত্তিতে রূপান্তরিত হবে:


class Book {
	@JsonProperty("name")
	public String title;
	public String author;
	public int pages;
 
	@JsonProperty("quotedTitle")
	public String getQuotedTitle() {
    	    return "\"" + title + "\"";
	}
}

সিরালাইজেশনের ফলাফল:

{
  "লেখক" : "প্র্যাচেট টি., গাইমান এন।",
  "পৃষ্ঠাগুলি" : 383,
  "নাম" : "গুড ওমেনস",
  "উদ্ধৃত শিরোনাম" : "\"ভাল লক্ষণ\""
}

@JsonInclude — এই টীকাটি ব্যবহার করে, আপনি এমন শর্তগুলি নির্দিষ্ট করতে পারেন যা একটি ক্ষেত্রকে সিরিয়ালাইজ করার জন্য অবশ্যই সন্তুষ্ট হতে হবে। আপনি এটি পৃথক ক্ষেত্র বা একটি সম্পূর্ণ ক্লাসে প্রয়োগ করতে পারেন। প্রথমে, চলুন শুরু না করা ক্ষেত্রগুলির সাথে একটি বস্তুকে সিরিয়ালাইজ করার চেষ্টা করি:


public class Solution {
	public static void main(String[] args) throws Exception {
    		Book book = new Book();

    		ObjectMapper mapper = new ObjectMapper();
    		mapper.enable(SerializationFeature.INDENT_OUTPUT);
    		String jsonBook = mapper.writeValueAsString(book);
    		System.out.println(jsonBook);
	}
}

সিরালাইজেশনের ফলাফল:

{
  "শিরোনাম" : শূন্য,
  "লেখক" : শূন্য,
  "পৃষ্ঠা" : 0
}

এবং যদি আপনি টীকা যোগ করেন:


@JsonInclude(JsonInclude.Include.NON_NULL)
class Book {
	public String title;
	public String author;
	public int pages;
}

তারপর আমরা এই ফলাফল পেতে:

{
  "পৃষ্ঠা" : 0
}

এখন শূন্য ক্ষেত্রগুলি সিরিয়াল করা হয় না।

@JsonPropertyOrder — এই টীকাটি আপনাকে ক্ষেত্রগুলিকে ক্রমানুসারে সেট করতে দেয়:


@JsonPropertyOrder({"author", "title", "pages"})
class Book {
	public String title;
	public String author;
	public int pages;
}

সিরালাইজেশনের ফলাফল:

{
  "লেখক" : "প্র্যাচেট টি., গাইমান এন।",
  "শিরোনাম" : "গুড ওমেনস",
  "পৃষ্ঠা" : 383
}

আপাতত, কীভাবে টীকা ব্যবহার করবেন তা মনে রাখবেন। এই মডিউলের শেষে, আমরা তাদের আরও ভালভাবে জানতে পারব এবং এমনকি আমাদের নিজস্ব টীকা তৈরি করতে পারব।

XML-এ সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন

আমাদের যদি XML-এ সিরিয়ালাইজ করতে হয়, আমরা একই সেটিংস এবং টীকা ব্যবহার করতে পারি। পার্থক্য শুধু বাস্তবায়ন হবেম্যাপার অবজেক্ট:


public static void main(String[] args) throws Exception {
	Book book = new Book();
	book.title = "Good Omens";
	book.author = "Pratchett T., Gaiman N.";
	book.pages = 383;
 
	ObjectMapper mapper = new XmlMapper();
	mapper.enable(SerializationFeature.INDENT_OUTPUT);
	String xmlBook = mapper.writeValueAsString(book);
	System.out.println(xmlBook);
}

আউটপুট:

 <Book>
  <title>Good Omens</title>
  <author>Pratchett T., Gaiman N.</author>
  <pages>383</pages>
</Book>

XML এর ডিসিরিয়ালাইজেশন:


public static void main(String[] args) throws Exception {
   String xmlString = """
            <Book>
             <title>Good Omens</title>
             <author>Pratchett T., Gaiman N.</author>
             <pages>383</pages>
           </Book>""";
   ObjectMapper mapper = new XmlMapper();
   Book book = mapper.readValue(xmlString, Book.class);
   System.out.println(book);
}

YAML-এ সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন

আমরা YAML হ্যান্ডেল করি যেভাবে আমরা XML পরিচালনা করি:


public static void main(String[] args) throws Exception {
	Book book = new Book();
	book.title = "Good Omens";
	book.author = "Pratchett T., Gaiman N.";
	book.pages = 383;
 
	ObjectMapper mapper = new YAMLMapper();
	mapper.enable(SerializationFeature.INDENT_OUTPUT);
	String yamlBook = mapper.writeValueAsString(book);
	System.out.println(yamlBook);
}

আউটপুট:

---
শিরোনাম: "গুড ওমেনস"
লেখক: "প্র্যাচেট টি., গাইমান এন।"
পৃষ্ঠা: 383

YAML এর ডিসিরিয়ালাইজেশন:


public static void main(String[] args) throws Exception {
   String yamlString = """
           ---
           title: "Good Omens"
           author: "Pratchett T., Gaiman N."
           pages: 383""";
   ObjectMapper mapper = new YAMLMapper();
   Book book = mapper.readValue(yamlString, Book.class);
   System.out.println(book);
}