জাভাতে জ্যাকসন দিয়ে JSON ফিল্ডের নাম পরিবর্তন করুন

জাভা এবং স্প্রিং বুট ভিত্তিক প্রকল্পগুলিতে JSON এবং সাধারণভাবে সিরিয়ালাইজেশন/ডিসারিয়ালাইজেশন পরিচালনা করার জন্য জ্যাকসন একটি খুব সাধারণ লাইব্রেরি।

জ্যাকসন সম্পত্তির নামগুলিকে ম্যাপ করার মাধ্যমে সেগুলিকে JSON-এর মতো করে পরিচালনা করে propertyName একটি POJO একটি সংশ্লিষ্ট থাকবে propertyName JSON-এ। JSON-কে POJO-তে রূপান্তর করার সময়ও এই নিয়ম অনুসরণ করা হয়, এবং নামগুলি না মিললে, রূপান্তর করা যাবে না।

যাইহোক, এমন অনেক ক্ষেত্রে রয়েছে যেখানে আপনি সিরিয়ালাইজড JSON বৈশিষ্ট্যগুলির ভিন্ন নাম রাখতে চান, যেমন অন্যান্য পরিষেবাগুলির জন্য নামকরণের প্রথার মানসম্মতকরণ (যেমন ক্ষেত্রে ব্যবহার করে snake_case, পরিবর্তে CamelCase) বা বিরোধপূর্ণ সম্পত্তির নাম (ক 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 ক্ষেত্রের নাম পরিবর্তন করুন

সাধারণত একটি উদাহরণ রূপান্তর করার সময় 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 থেকে পড়ার সময় (deserializing), আপনাকে একটি সরবরাহ করতে হবে book_title, যে ম্যাপ করা হয় title.

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

বিঃদ্রঃ: উভয় 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