جاوا میں جیکسن کے ساتھ JSON فیلڈ کا نام تبدیل کریں۔

جاوا اور اسپرنگ بوٹ پر مبنی پروجیکٹس میں JSON اور سیریلائزیشن/ڈی سیریلائزیشن کو ہینڈل کرنے کے لیے جیکسن ایک بہت عام لائبریری ہے۔

جیکسن جائیداد کے ناموں کو نقشہ بنا کر ہینڈل کرتا ہے جیسا کہ وہ JSON کے لیے ہیں۔ propertyName ایک POJO میں ایک متعلقہ پڑے گا propertyName JSON میں۔ JSON کو POJO میں تبدیل کرتے وقت بھی اس کنونشن کی پیروی کی جاتی ہے، اور اگر نام مماثل نہیں ہوتے ہیں، تو تبدیلی نہیں کی جا سکتی۔

تاہم، ایسے بہت سے معاملات ہیں جن میں آپ چاہتے ہیں کہ سیریلائزڈ JSON پراپرٹیز کے مختلف نام ہوں، جیسے کہ دیگر خدمات کے لیے نام سازی کے کنونشنز کو معیاری بنانا (جیسے کیسز کا استعمال کرتے ہوئے snake_caseکے بجائے ، CamelCase) یا متضاد جائیداد کے نام (a Customer ایک ہو سکتا ہے firstName، صرف ایک کے طور پر Agent - اور ایک رپورٹ ان دونوں پر مشتمل ہو سکتی ہے۔ firstName خصوصیات اور سیریلائز کرنے کی ضرورت ہے)۔

آئیے ایک بنائیں 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}

۔ title, author اور releaseYear کی 1 سے 1 میپنگ ہے۔ title, author اور releaseYear POJO کے فیلڈز۔ 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 سے 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 (ڈی سیریلائز) سے پڑھتے وقت، آپ کو ایک فراہم کرنے کی ضرورت ہوگی۔ book_title، جس پر نقشہ لگایا جاتا ہے۔ title.

بہترین طرز عمل، صنعت کے لیے منظور شدہ معیارات، اور چیٹ شیٹ کے ساتھ 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 فیلڈ لیول کے بجائے طریقہ کی سطح پر تشریح۔

ٹائم اسٹیمپ:

سے زیادہ Stackabuse