जावा में जैक्सन के साथ JSON फ़ील्ड नाम बदलें

जैक्सन सामान्य रूप से जावा और स्प्रिंग बूट आधारित परियोजनाओं में JSON और क्रमांकन/deserialization को संभालने के लिए एक बहुत ही सामान्य पुस्तकालय है।

जैक्सन संपत्ति के नामों को जेएसओएन के रूप में मैप करके उन्हें संभालता है - इसलिए propertyName एक पीओजेओ में एक संबंधित होगा propertyName जेएसओएन में। जेएसओएन को पीओजेओ में परिवर्तित करते समय भी इस सम्मेलन का पालन किया जाता है, और यदि नाम मेल नहीं खाते हैं, तो रूपांतरण नहीं किया जा सकता है।

हालांकि, ऐसे कई मामले हैं जिनमें आप चाहते हैं कि क्रमबद्ध JSON गुणों के अलग-अलग नाम हों, जैसे अन्य सेवाओं के लिए नामकरण परंपराओं का मानकीकरण (जैसे मामलों का उपयोग करना) snake_case, के बजाय CamelCase) या परस्पर विरोधी संपत्ति के नाम (a Customer एक हो सकता है firstName, बस एक के रूप में Agent - और एक रिपोर्ट में दोनों शामिल हो सकते हैं firstName properties और क्रमबद्ध करने की आवश्यकता है)।

आइए बनाते हैं a Book कक्षा, कुछ सरल क्षेत्रों के साथ:

public class Book {
    private String title;
    private String author;
    private int releaseYear;
    
    public Book() {}
    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    
}

जैक्सन के साथ JSON फ़ील्ड नाम बदलें

जब आमतौर पर a . का उदाहरण परिवर्तित किया जाता है Book JSON में, हम ऑब्जेक्ट का मान JSON स्ट्रिंग के रूप में लिखेंगे ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
        
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

इसका परिणाम यह होगा:

{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}

RSI title, author और releaseYear करने के लिए एक 1-से-1 मानचित्रण कर रहे हैं title, author और releaseYear पीओजेओ के क्षेत्र। JSON प्रॉपर्टी का नाम बदलने और क्रमांकन के बाद इसे बनाए रखने के लिए, अपने POJO को बदलने की कोई आवश्यकता नहीं है! प्रासंगिक फ़ील्ड को एनोटेट करने के लिए पर्याप्त है @JsonProperty, और JSON नाम की आपूर्ति करें:

public class Book {
    @JsonProperty("book_title")
    private String title;
    @JsonProperty("book_author")
    private String author;
    @JsonProperty("book_release_year")
    private int releaseYear;
    
    public Book(){}
    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    
}

अब, जब हम ऑब्जेक्ट को इंस्टेंट करते हैं और इसे JSON में कनवर्ट करते हैं:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);

String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

कोड का परिणाम है:

{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}

JSON-to-POJO रूपांतरण में JSON फ़ील्ड नाम बदलें?

यह ध्यान देने योग्य है कि नाम परिवर्तन एकतरफा नहीं है। एक ही एनोटेशन दोनों तरीकों से काम करता है, और आने वाले JSON को अलग-अलग नामों से एक मान्य ऑब्जेक्ट में पाट सकता है। उदाहरण के लिए, एक JSON एक पुस्तक का प्रतिनिधित्व करता है book_title, को मैप नहीं किया जाएगा title की संपत्ति Book डिफ़ॉल्ट रूप से वर्ग, क्योंकि वे समान नहीं हैं।

चूंकि हमने टिप्पणी की है title as book_title - रूपांतरण ठीक काम करता है:

Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);

इसका परिणाम यह होगा:

Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}

नोट: JSON से ऑब्जेक्ट बनाने के लिए, आपकी कक्षा में एक खाली कंस्ट्रक्टर भी होना चाहिए। जैक्सन पहले खाली वस्तु को इंस्टेंट करता है, और फिर गेटर्स और सेटर्स का उपयोग करके फ़ील्ड को पॉप्युलेट करता है।

@JsonProperty के साथ गेटर्स और सेटर्स को एनोटेट करें

क्या आप क्रमांकन और अक्रमांकन के लिए अलग-अलग नामों को एन्कोड करना चाहते हैं? उदाहरण के लिए, आप क्रमबद्ध कर सकते हैं Book के साथ एक JSON में bt पुस्तक के शीर्षक को दर्शाते हुए, लेकिन JSON का उपभोग करें book_title. आप के गेटर्स और सेटर्स को कस्टमाइज़ कर सकते हैं Book कक्षा के साथ @JsonProperty एनोटेशन:

@JsonProperty("bt")
public String getBt() {
    return title;
}

@JsonProperty("book_title")
public void setTitle(String title) {
    this.title = title;
}

इस तरह, जब क्रमबद्ध किया जाता है, getBt() विधि क्रमबद्ध होगी title एक के रूप में bt JSON में फ़ील्ड। JSON (deserializing) से पढ़ते समय, आपको आपूर्ति करने की आवश्यकता होगी a book_title, जिसे मैप किया जाता है title.

सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!

नोट: दोनों bt और book_title के लिए मैप किया जाएगा title क्षेत्र, लेकिन यह नहीं बनाता है bt और book_title विनिमेय। जैक्सन पहले परिवर्तित किए बिना उनके बीच परिवर्तित नहीं हो पाएगा title.

अब, आप एक पुस्तक को इंस्टेंट कर सकते हैं, उसे क्रमबद्ध कर सकते हैं, और एक अन्य स्ट्रिंग को एक पुस्तक में डिसेरिएलाइज़ कर सकते हैं:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);


String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);


String input = "{"author":"Max Tegmark","releaseYear":2017,"book_title":"Life 3.0"}";
Book bookReconstructed = mapper.readValue(input, Book.class);
System.out.print(bookReconstructed);

इसका परिणाम यह होगा:

{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}

निष्कर्ष

इस संक्षिप्त ट्यूटोरियल में, हमने इस बात पर एक नज़र डाली है कि कैसे जैक्सन ऑब्जेक्ट फ़ील्ड को JSON पर मैप करता है, और आप क्रमांकन से पहले फ़ील्ड का नाम कैसे बदल सकते हैं। हमने क्रमांकन और अक्रमांकन के लिए विभिन्न JSON नामों का उपयोग करने के विचार का भी पता लगाया है @JsonProperty क्षेत्र-स्तर के बजाय विधि-स्तर पर एनोटेशन।

समय टिकट:

से अधिक स्टैकब्यूज