जॅक्सन हे जावा ऑब्जेक्ट्सना विविध टेक्स्ट फॉरमॅटमध्ये सीरियलाइज/डिसिरियलाइज करण्यासाठी लोकप्रिय लायब्ररी आहे. ऑब्जेक्टमॅपर क्लास हा JSON फॉरमॅटसह काम करण्याचा लायब्ररीचा मुख्य मार्ग आहे. इतर स्वरूपांसाठी, आमच्याकडे त्याचे वंशज आहेत ( XmlMapper , YAMLMapper ). अनुवांशिकतेबद्दल धन्यवाद, आम्ही एकाच इंटरफेसद्वारे सर्व स्वरूपांसह सुसंगतपणे कार्य करू शकतो.

जार फाइल्स डाउनलोड करा

उदाहरणांचा अभ्यास करण्यापूर्वी, आम्हाला जॅक्सन जार फाइल्स डाउनलोड कराव्या लागतील आणि त्यांना IntelliJ IDEA मधील प्रकल्पाशी जोडणे आवश्यक आहे. आवश्यक फाइल्स कशा शोधायच्या हे पाहण्यासाठी jackson-databind चे उदाहरण घेऊ :

  1. Maven Repository वेबसाइटवर जा .

  2. शोध बॉक्समध्ये " jackson-databind " प्रविष्ट करा. तुम्हाला पुढील गोष्टी मिळतील:

  3. प्रथम शोध परिणाम आम्हाला स्वारस्य आहे. दुव्याचे अनुसरण करा.

  4. कधीकधी एखाद्या प्रकल्पातील इतर घटकांशी सुसंगतता सुनिश्चित करण्यासाठी लायब्ररीची विशिष्ट आवृत्ती आवश्यक असू शकते. नवीनतम आवृत्तीने कार्य केले पाहिजे (हा धडा लिहिण्याच्या वेळी, ते 2.13.2.2 आहे). दुव्याचे अनुसरण करा.

  5. उघडलेल्या पृष्ठावर, तुम्हाला "बंडल" लिंक हवी आहे:

  6. ही लिंक वापरून जार फाइल डाउनलोड करा .

तत्सम प्रक्रियेचे अनुसरण करून, आपण उर्वरित आवश्यक जार फायली शोधू आणि डाउनलोड करू शकता:

सर्व आवश्यक फाइल्स डाउनलोड केल्यानंतर, त्यांना IntelliJ IDEA मधील प्रोजेक्टशी कनेक्ट करा:

  1. प्रोजेक्ट सेटिंग्ज उघडा (तुम्ही Ctrl+Alt+Shift+S की संयोजनाने करू शकता).

  2. लायब्ररीवर जा .

  3. + आणि नंतर "Java" दाबा . डाउनलोड केलेल्या सर्व फायली निवडा. आम्ही काय समाप्त केले पाहिजे ते येथे आहे:

  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":"Good Omens","author":"Pratchett T., Gaiman N.","pages":383}

ऑब्जेक्टमॅपरमध्ये बरीच प्रगत सेटिंग्ज आहेत . JSON स्ट्रिंग अधिक वाचनीय बनवण्यासाठी त्यापैकी एक वापरू. तयार केल्यानंतरऑब्जेक्टमॅपरऑब्जेक्ट, हे विधान कार्यान्वित करा:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

आउटपुटमधील माहिती सारखीच राहते, परंतु आता इंडेंटेशन आणि लाइन ब्रेक आहेत:

{
  "शीर्षक" : "गुड ओमेन्स",
  "लेखक" : "प्रॅचेट टी., गेमन एन.",
 "पृष्ठे" : ३८३
}

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);
}

आउटपुट:

पुस्तक{title='Good Omens', author='Pratchett T., Gaiman N.', pages=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);
}

हा कोड कार्यान्वित केल्याने आम्हाला एक UnrecognizedPropertyException मिळतो . हे डीफॉल्ट वर्तन आहे, परंतु आम्ही ते बदलू शकतो:


ObjectMapper mapper =
new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 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);
}

आउटपुट:

 <पुस्तक>
  <शीर्षक>गुड ओमेन्स</title>
  <लेखक>प्रॅचेट टी., गैमन एन.</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 मध्ये सीरियलायझेशन आणि डीसीरियलायझेशन

आम्ही XML हाताळतो त्याच प्रकारे आम्ही YAML हाताळतो:


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);
}

आउटपुट:

---
शीर्षक: "Good Omens"
लेखक: "Pratchett T., Gaiman N."
पृष्ठे: 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);
}