जैक्सन विभिन्न पाठ स्वरूपों में जावा ऑब्जेक्ट्स को क्रमबद्ध/डिसेरलाइज़ करने के लिए एक लोकप्रिय पुस्तकालय है। ObjectMapper क्लास JSON फॉर्मेट के साथ काम करने के लिए लाइब्रेरी का मुख्य तरीका है अन्य स्वरूपों के लिए, हमारे पास इसके वंशज हैं ( XmlMapper , YAMLMapper )। विरासत के लिए धन्यवाद, हम सभी प्रारूपों के साथ एक ही इंटरफ़ेस के माध्यम से एक सुसंगत तरीके से काम कर सकते हैं।

जार फ़ाइलें डाउनलोड करें

उदाहरणों का अध्ययन करने से पहले, हमें जैक्सन जार फ़ाइलों को डाउनलोड करना होगा और उन्हें IntelliJ IDEA में प्रोजेक्ट से जोड़ना होगा। आवश्यक फ़ाइलों की खोज कैसे करें, यह देखने के लिए आइए जैक्सन-डेटाबाइंड का उदाहरण लें:

  1. मेवेन रिपोजिटरी वेबसाइट पर जाएं ।

  2. खोज बॉक्स में " जैक्सन-डाटाबाइंड " दर्ज करें। आपको निम्नलिखित मिलेंगे:

  3. पहला खोज परिणाम वह है जिसमें हम रुचि रखते हैं। लिंक का अनुसरण करें।

  4. कभी-कभी किसी परियोजना में अन्य घटकों के साथ अनुकूलता सुनिश्चित करने के लिए पुस्तकालय के किसी विशेष संस्करण की आवश्यकता हो सकती है। नवीनतम संस्करण काम करना चाहिए (इस पाठ को लिखने के समय, यह 2.13.2.2 है)। लिंक का पालन करें।

  5. खुलने वाले पृष्ठ पर, आप "बंडल" लिंक चाहते हैं:

  6. इस लिंक का उपयोग कर जार फ़ाइल डाउनलोड करें ।

इसी तरह की प्रक्रिया का पालन करते हुए, आप बाकी आवश्यक जार फ़ाइलों को ढूंढ और डाउनलोड कर सकते हैं:

सभी आवश्यक फ़ाइलों को डाउनलोड करने के बाद, उन्हें IntelliJ IDEA में प्रोजेक्ट से कनेक्ट करें:

  1. प्रोजेक्ट सेटिंग्स खोलें (आप Ctrl+Alt+Shift+S कुंजी संयोजन के साथ कर सकते हैं)।

  2. पुस्तकालयों में जाएँ ।

  3. प्रेस + और फिर "जावा"। सभी डाउनलोड की गई फ़ाइलों का चयन करें। यहाँ वह है जिसके साथ हमें समाप्त होना चाहिए:

  4. यह हमारे प्रारंभिक कार्य का समापन करता है। अब हम ObjectMapper को क्रिया में आज़मा सकते हैं ।

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

रनिंग मेन आपको यह आउटपुट देगा:

{"शीर्षक": "शुभ संकेत","लेखक": "प्रचेत टी., गैमन एन.","पृष्ठ":383}

ObjectMapper में बहुत सारी उन्नत सेटिंग्स हैं। JSON स्ट्रिंग को अधिक पठनीय बनाने के लिए उनमें से एक का उपयोग करते हैं। बनाने के बादऑब्जेक्टमैपरवस्तु, इस कथन को निष्पादित करें:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

आउटपुट में जानकारी समान रहती है, लेकिन अब इंडेंटेशन और लाइन ब्रेक हैं:

{
  "शीर्षक": "अच्छा संकेत",
  "लेखक": "प्रचेत टी।, गैमन एन।",
 "पेज": 383
}

JSON से अक्रमांकन

अब इसके विपरीत क्रिया करते हैं: हम एक स्ट्रिंग को एक वस्तु में deserialize करेंगे। यह देखने के लिए कि प्रोग्राम क्या कर रहा है, आइए Book क्लास में 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}

रीडवैल्यू विधि अतिभारित है - इसमें कई भिन्नताएं हैं जो एक फ़ाइल, एक लिंक, विभिन्न इनपुट स्ट्रीम आदि लेती हैं। सरलता के लिए, हमारा उदाहरण एक वेरिएंट का उपयोग करता है जो JSON स्ट्रिंग को स्वीकार करता है

जैसा ऊपर बताया गया है, ऑब्जेक्टमैपर में कई सेटिंग्स हैं। आइए उनमें से कुछ को देखें।

अज्ञात गुणों की उपेक्षा

ऐसी स्थिति पर विचार करें जहां JSON स्ट्रिंग में ऐसी संपत्ति है जो Book क्लास में मौजूद नहीं है:


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

एक बनाते समयऑब्जेक्टमैपरऑब्जेक्ट, हम संबंधित सेटिंग को गलत पर सेट करने के लिए कॉन्फ़िगर विधि का उपयोग करते हैं । कॉन्फ़िगर विधि उस ऑब्जेक्ट को संशोधित करती है जिस पर इसे कॉल किया गया था और फिर वही ऑब्जेक्ट लौटाता है, इसलिए हम इस कॉल को एक अलग तरीके से कर सकते हैं:


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 - यह एनोटेशन आपको क्रमबद्ध डेटा का प्रारूप सेट करने देता है। चलिए Book क्लास में एक और फील्ड, एक Date जोड़ते हैं :


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 में क्रमांकन और अक्रमांकन

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


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>प्रचेत टी., गैमन एन.</author>
  <pages>383</pages>
</Book>

एक्सएमएल का अक्रमांकन:


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