Gson — এটি কী, Java এবং Kotlin এর জন্য JSON লাইব্রেরি

লেখক: IT Sectr প্রকাশিত: 2026-03-15 পড়ার সময়: 8 মিনিট

Gson — Java অবজেক্টকে JSON এ এবং পিছনে সিরিয়ালাইজ করার জন্য Google এর একটি লাইব্রেরি, যা Android ডেভেলপমেন্টে ব্যাপকভাবে ব্যবহৃত হয়। এটি ম্যানুয়ালি পার্সার না লিখেই জটিল অবজেক্ট গ্রাফকে কমপ্যাক্ট JSON স্ট্রিংয়ে রূপান্তর করতে দেয়। Google Gson, 2024 অনুসারে, লাইব্রেরিটির GitHub এ 23 হাজারেরও বেশি স্টার রয়েছে এবং এটি Java এবং Kotlin ইকোসিস্টেমে JSON নিয়ে কাজ করার জন্য সবচেয়ে জনপ্রিয় সমাধানগুলির মধ্যে একটি।

মূল পয়েন্ট

  • Gson — Java এবং Kotlin এ JSON সিরিয়ালাইজেশনের জন্য Google লাইব্রেরি
  • fromJson — JSON কে যেকোনো Java অবজেক্ট টাইপে ডিসিরিয়ালাইজ করে
  • toJson — অবজেক্টকে JSON স্ট্রিংয়ে সিরিয়ালাইজ করে
  • @SerializedName — JSON কী কে ক্লাস ফিল্ডের সাথে ম্যাপ করার জন্য অ্যানোটেশন
  • TypeToken — জেনেরিক এবং প্যারামিটারাইজড টাইপ নিয়ে কাজ করা

Gson কী

Gson হল Google দ্বারা উন্নত একটি Java লাইব্রেরি যা অবজেক্টকে JSON উপস্থাপনায় এবং পিছনে রূপান্তর করার জন্য। এটি ক্লাসের গঠন বিশ্লেষণ করতে রিফ্লেকশন ব্যবহার করে, যা পূর্ব কনফিগারেশন ছাড়াই কাজ করতে দেয়। Gson নির্বিচার Java অবজেক্ট, কালেকশন, অ্যারে, জেনেরিক এবং নেস্টেড ক্লাস সমর্থন করে। লাইব্রেরির মৌলিক ব্যবহারের জন্য অ্যানোটেশনের প্রয়োজন নেই, তবে সূক্ষ্ম টিউনিংয়ের জন্য সেগুলি প্রদান করে। রিফ্লেকশনের প্রধান ত্রুটি হল ইনিশিয়ালাইজেশনের সময় কর্মক্ষমতা হ্রাস এবং কম্পাইল সময়ে অপ্টিমাইজেশনের অক্ষমতা, যা শত শত মডেল ডিসিরিয়ালাইজ করার সময় Android অ্যাপ্লিকেশনের কোল্ড স্টার্টে বিশেষভাবে লক্ষণীয়। তা সত্ত্বেও, Gson তার স্থিতিশীলতা এবং বিস্তৃত ডকুমেন্টেশনের কারণে বেশিরভাগ প্রকল্পের জন্য একটি নির্ভরযোগ্য পছন্দ হিসাবে রয়ে গেছে।

ইতিহাস এবং ইকোসিস্টেমে স্থান

Gson 2008 সালে Google দ্বারা প্রকাশিত হয়েছিল এবং দ্রুত Android অ্যাপ্লিকেশনে JSON-এর ডি ফ্যাক্টো স্ট্যান্ডার্ডে পরিণত হয়েছিল। Moshi এবং kotlinx.serialization আসার আগে, Gson ছিল Kotlin প্রকল্পের জন্য একমাত্র জনপ্রিয় পছন্দ। একীকরণের সহজতা — build.gradle এ একটি নির্ভরতা যোগ করা — এবং বাধ্যতামূলক অ্যানোটেশনের অনুপস্থিতি Gson কে সব স্তরের ডেভেলপারদের মধ্যে জনপ্রিয় করে তুলেছে।

groovy
// build.gradle এ Gson যোগ করা
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

// মৌলিক ব্যবহার
data class User(
    val id: Int,
    val name: String,
    val email: String
)

val gson = Gson()
val user = User(1, "John", "john@test.com")
val json = gson.toJson(user)
println(json) // {"id":1,"name":"John","email":"john@test.com"}

মৌলিক সিরিয়ালাইজেশন ছাড়াও, Gson আচরণ কনফিগার করার জন্য GsonBuilder প্রদান করে: তারিখ ফরম্যাটিং, HTML এস্কেপিং নিষ্ক্রিয় করা, কী কেস এবং কাস্টম ইনস্ট্যান্স। GsonBuilder এমন টাইপের জন্য কাস্টম JsonSerializer এবং JsonDeserializer নিবন্ধন করারও অনুমতি দেয় যা লাইব্রেরি স্বয়ংক্রিয়ভাবে পরিচালনা করতে পারে না। কনফিগারেশন নমনীয়তা GsonBuilder কে আধুনিক Android ডেভেলপমেন্টে নির্দিষ্ট প্রকল্পের প্রয়োজনীয়তার সাথে লাইব্রেরি মানিয়ে নেওয়ার সময় একটি অপরিহার্য এবং দরকারী টুল করে তোলে।

মূল অপারেশন toJson এবং fromJson

toJson রিফ্লেকশনের মাধ্যমে ফিল্ড বিশ্লেষণ করে একটি Java অবজেক্টকে JSON স্ট্রিংয়ে রূপান্তর করে। ডিফল্টরূপে, Gson transient এবং static ব্যতীত সমস্ত ফিল্ড অন্তর্ভুক্ত করে। পদ্ধতিটি যেকোনো টাইপ সমর্থন করে: প্রিমিটিভ, অবজেক্ট, কালেকশন এবং অ্যারে। fromJson বিপরীত অপারেশন সম্পাদন করে, একটি JSON স্ট্রিং এবং টার্গেট অবজেক্ট ক্লাস গ্রহণ করে এবং পূর্ণ ফিল্ড সহ একটি ইনস্ট্যান্স ফেরত দেয়।

অবজেক্টকে JSON এ রূপান্তর করা

সিরিয়ালাইজেশনের সময়, Gson নেস্টেড ফিল্ড সহ সমস্ত অবজেক্ট ফিল্ড পুনরাবৃত্তভাবে ট্রাভার্স করে। চক্রীয় রেফারেন্স StackOverflowError-এর দিকে নিয়ে যায়, তাই সেগুলিকে @Expose অ্যানোটেশন বা কাস্টম অ্যাডাপ্টারের মাধ্যমে বাদ দিতে হবে। কালেকশনের জন্য, Gson উপাদানের ধরন সংরক্ষণ করে, কিন্তু জেনেরিক সহ তালিকা ডিসিরিয়ালাইজ করার সময় টাইপ তথ্য সংরক্ষণের জন্য TypeToken প্রয়োজন।

kotlin
// নেস্টেড অবজেক্ট সহ data class
data class Address(
    val city: String,
    val street: String
)

data class Employee(
    val id: Int,
    val name: String,
    val address: Address
)

val gson = Gson()
val employee = Employee(1, "Alice",
    Address("New York", "5th Ave"))

// JSON এ সিরিয়ালাইজেশন
val json = gson.toJson(employee)

// JSON থেকে ডিসিরিয়ালাইজেশন
val jsonString = """
{"id":2,"name":"Bob","address":{"city":"London","street":"Baker St"}}
"""
val parsed = gson.fromJson(jsonString, Employee::class.java)

অ্যানোটেশন এবং কনফিগারেশন

Gson সিরিয়ালাইজেশন প্রক্রিয়া পরিচালনার জন্য অ্যানোটেশনের একটি সেট প্রদান করে। @SerializedName JSON কী নাম নির্দিষ্ট করে যা ফিল্ডের নাম থেকে ভিন্ন। @Expose নিয়ন্ত্রণ করে যে একটি ফিল্ড সিরিয়ালাইজেশনে অন্তর্ভুক্ত কিনা: GsonBuilder.excludeFieldsWithoutExposeAnnotation() এর মাধ্যমে তৈরি Gson শুধুমাত্র @Expose সহ ফিল্ড প্রক্রিয়া করবে। @Since এবং @Until ফিল্ড সংস্করণ নিয়ন্ত্রণ করে।

@SerializedName এবং @Expose

@SerializedName অ্যানোটেশন নামের অমিলের সমস্যা সমাধান করে: সার্ভার snake_case ব্যবহার করতে পারে যখন কোডে camelCase ব্যবহার করা হয়। অ্যানোটেশনটি পশ্চাদগামী সামঞ্জস্যের জন্য একটি মান এবং ঐচ্ছিক বিকল্প গ্রহণ করে। @Expose সংবেদনশীল ফিল্ড (পাসওয়ার্ড, টোকেন) কে @Expose(serialize = false) হিসাবে চিহ্নিত করে সিরিয়ালাইজেশন থেকে লুকানোর অনুমতি দেয়। অন্তর্ভুক্তি এবং বর্জন ছাড়াও, @Expose ফিল্ডের সাদা তালিকা তৈরি করতে GsonBuilder.excludeFieldsWithoutExposeAnnotation এর সাথে একত্রিত করা যেতে পারে, যা অনেক ফিল্ড সহ অবজেক্ট সিরিয়ালাইজ করার সময় আক্রমণের পৃষ্ঠ নিয়ন্ত্রণ করতে সাহায্য করে।

kotlin
// Gson অ্যানোটেশন সহ মডেল
data class UserResponse(
    @SerializedName("user_id")
    val userId: Int,

    @SerializedName("full_name",
        alternate = [Alternative("name")])
    val fullName: String,

    @Expose(serialize = false)
    val password: String
)

// @Expose ফিল্টারিং সহ Gson
val gson = GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .setPrettyPrinting()
    .create()

val user = UserResponse(1, "John", "secret123")
println(gson.toJson(user))
// {"user_id":1,"full_name":"John"} — পাসওয়ার্ড বাদ দেওয়া হয়েছে

জেনেরিক নিয়ে কাজ করা

জেনেরিকের সমস্যা Java এবং Kotlin এ কম্পাইল সময়ে টাইপ মুছে ফেলা। যখন Gson List<User> ডিসিরিয়ালাইজ করে, এটি উপাদানের ধরন জানে না এবং List<Map<String, Any>> ফেরত দেয়। টাইপ তথ্য সংরক্ষণের জন্য, Gson TypeToken প্রদান করে — একটি বিমূর্ত ক্লাস যা বেনামী ক্লাসের মাধ্যমে টাইপ প্যারামিটার ক্যাপচার করে। TypeToken ছাড়া, ডেভেলপারকে ম্যানুয়ালি প্রতিটি উপাদানকে Map থেকে টার্গেট টাইপে রূপান্তর করতে হবে, যা জটিল কোড এবং কর্মক্ষমতা হ্রাসের দিকে নিয়ে যায়।

তালিকার জন্য TypeToken

TypeToken টাইপ মুছে ফেলার সমস্যা সমাধান করে। ডেভেলপার প্রয়োজনীয় টাইপ প্যারামিটার সহ TypeToken এর একটি বেনামী সাবক্লাস তৈরি করে, এবং Gson সঠিক ডিসিরিয়ালাইজেশনের জন্য ক্লাস স্বাক্ষর থেকে তথ্য ব্যবহার করে। TypeToken Map, Set এবং যেকোনো অন্যান্য প্যারামিটারাইজড টাইপের সাথেও কাজ করে, যার মধ্যে নেস্টেড জেনেরিক রয়েছে। বিশেষ করে, Map<String, List<User>>-এর জন্য, সম্পূর্ণ নেস্টেড টাইপ স্বাক্ষর সহ TypeToken প্রয়োজন, অন্যথায় Gson List<User>-এর পরিবর্তে মানগুলিকে List<Map<String, Any>> হিসাবে ডিসিরিয়ালাইজ করে।

kotlin
// তালিকা ডিসিরিয়ালাইজেশনের জন্য TypeToken
data class Product(
    val id: Int,
    val title: String,
    val price: Double
)

val jsonArray = """
[
    {"id":1,"title":"Phone","price":599.0},
    {"id":2,"title":"Laptop","price":1299.0}
]
"""

val gson = Gson()
val listType = object : TypeToken<List<Product>>() {}
val products: List<Product> =
    gson.fromJson(jsonArray, listType.type)

// কাস্টম ডিসিরিয়ালাইজার
class LocalDateAdapter :
    JsonDeserializer<LocalDate> {

    override fun deserialize(
        json: JsonElement,
        typeOfT: java.lang.reflect.Type,
        context: JsonDeserializationContext
    ): LocalDate {
        return LocalDate.parse(json.asString)
    }
}

কাস্টম সিরিয়ালাইজেশন লজিকের জন্য, Gson JsonSerializer এবং JsonDeserializer ইন্টারফেস সমর্থন করে। এগুলি GsonBuilder.registerTypeAdapter() এর মাধ্যমে নিবন্ধিত হয় এবং লাইব্রেরি স্বয়ংক্রিয়ভাবে সিরিয়ালাইজ করতে পারে না এমন টাইপগুলি পরিচালনা করার অনুমতি দেয়: Java 8 তারিখ, অ-মানক মান সহ Enum, বা সোর্স কোডে অ্যাক্সেস ছাড়া তৃতীয় পক্ষের ক্লাস। অ্যাডাপ্টার বাস্তবায়ন করার সময়, কর্মক্ষমতা পর্যবেক্ষণ করা গুরুত্বপূর্ণ: কাস্টম অ্যাডাপ্টারের ভিতরে রিফ্লেকশন কল করা ম্যানুয়াল নিয়ন্ত্রণের সুবিধাগুলি বাতিল করে, তাই সরাসরি পদ্ধতি এবং ফিল্ড কল পছন্দ করা হয়। Gson ইকোসিস্টেমে gson-extras মডিউলও রয়েছে, যা UUID, Optional এবং Joda-Time তারিখ চাকার মতো সাধারণ টাইপগুলির জন্য অ্যাডাপ্টার প্রদান করে।

GsonBuilder এর মাধ্যমে কনফিগারেশন

GsonBuilder সূক্ষ্ম টিউনিং সিরিয়ালাইজেশনের জন্য ডজন ডজন পদ্ধতি প্রদান করে। setPrettyPrinting পঠনযোগ্যতার জন্য আউটপুট JSON-এ ইন্ডেন্টেশন এবং লাইন ব্রেক যোগ করে। disableHtmlEscaping স্ট্রিং-এ HTML অক্ষর এস্কেপিং নিষ্ক্রিয় করে। setDateFormat তারিখ বিন্যাস নির্দিষ্ট করে, যা অ-মানক সময় উপস্থাপনা ব্যবহার করে এমন সার্ভারের সাথে কাজ করার সময় গুরুত্বপূর্ণ। setLenient শিথিল পার্সিং মোড সক্ষম করে, যা কিছু JSON ফরম্যাটিং ত্রুটি উপেক্ষা করে। addDeserializationExclusionStrategy কাস্টম কৌশলের উপর ভিত্তি করে প্রোগ্রামেটিকভাবে ফিল্ডকে ডিসিরিয়ালাইজেশন থেকে বাদ দেওয়ার অনুমতি দেয়। ডিবাগিংয়ের জন্য, লগিংয়ের সাথে মিলিত setPrettyPrinting দরকারী — এটি JSON প্রতিক্রিয়াগুলিকে লগে পঠনযোগ্য করে তোলে এবং অসামঞ্জস্য খোঁজা সহজ করে।

GsonBuilder-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল @Since এবং @Until অ্যানোটেশনের মাধ্যমে ফিল্ড সংস্করণ পরিচালনা। ডেভেলপার setVersion-এর মাধ্যমে অবজেক্ট সংস্করণ নির্দিষ্ট করে, এবং Gson স্বয়ংক্রিয়ভাবে তাদের সংস্করণ অ্যানোটেশনের উপর ভিত্তি করে ফিল্ড অন্তর্ভুক্ত বা বাদ দেয়। এটি API বিবর্তনের সময় দরকারী যখন একই মডেল সার্ভার প্রোটোকলের বিভিন্ন সংস্করণের জন্য ব্যবহৃত হয়। GsonBuilder পরিবার টাইপের বিশ্বব্যাপী হ্যান্ডলিংয়ের জন্য TypeAdapterFactory এবং জটিল Map কীগুলির সাথে সঠিক কাজের জন্য complexMapKeySerialization নিবন্ধন করাও সমর্থন করে।

সচরাচর জিজ্ঞাসা

Android ডেভেলপমেন্টে Gson কী?

Gson হল Google-এর একটি লাইব্রেরি যা Java অবজেক্টকে JSON এ এবং পিছনে রূপান্তর করার জন্য। এটি সার্ভার প্রতিক্রিয়া পার্স করা, অনুরোধ সিরিয়ালাইজ করা এবং লোকাল স্টোরেজে ডেটা সংরক্ষণের জন্য Android অ্যাপ্লিকেশনে ব্যাপকভাবে ব্যবহৃত হয়।

Gson কীভাবে null মানগুলি পরিচালনা করে?

ডিফল্টরূপে, Gson সিরিয়ালাইজেশনের সময় null ফিল্ড এড়িয়ে যায়। null মান অন্তর্ভুক্ত করতে, GsonBuilder.serializeNulls() ব্যবহার করুন। ডিসিরিয়ালাইজেশনের সময়, JSON-এ অনুপস্থিত ফিল্ড null থাকে বা টাইপের জন্য ডিফল্ট মান নেয়।

Gson Moshi থেকে কীভাবে আলাদা?

Moshi Kotlin ক্লাসের জন্য রিফ্লেকশন ব্যবহার করে না, যা উচ্চতর কর্মক্ষমতা এবং পূর্বাভাসযোগ্য আচরণ প্রদান করে। Moshi সঠিকভাবে Kotlin-এর null নিরাপত্তাও পরিচালনা করে, যেখানে Gson একটি non-null ফিল্ডে null ডিসিরিয়ালাইজ করতে পারে, যা ব্যতিক্রম সৃষ্টি করে।

Gson-এ @SerializedName কীভাবে কাজ করে?

@SerializedName তাদের নাম মেলে না গেলে JSON কীকে ক্লাস ফিল্ডের সাথে বাঁধে। উদাহরণস্বরূপ, kotlinName ফিল্ড এবং "kotlin_name" JSON কী-এর জন্য, @SerializedName("kotlin_name") অ্যানোটেশন সঠিক রূপান্তর নিশ্চিত করে।

Gson-এ TypeToken কী?

TypeToken একটি বিমূর্ত ক্লাস যা বেনামী ক্লাসের মাধ্যমে টাইপ প্যারামিটার ক্যাপচার করে। এটি কালেকশন এবং অন্যান্য প্যারামিটারাইজড টাইপ ডিসিরিয়ালাইজ করার জন্য প্রয়োজনীয়, কারণ টাইপ মুছে ফেলার কারণে, Gson রানটাইমে উপাদানের ধরন পুনরুদ্ধার করতে পারে না।

সারসংক্ষেপ

  • Gson — Java এবং Kotlin সমর্থন সহ JSON সিরিয়ালাইজেশনের জন্য Google লাইব্রেরি
  • toJson এবং fromJson — অবজেক্ট সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করার প্রধান পদ্ধতি
  • @SerializedName — নাম অমিল হলে ফিল্ডকে JSON কী-তে ম্যাপ করার জন্য অ্যানোটেশন
  • @Expose — GsonBuilder এর মাধ্যমে সিরিয়ালাইজেশনের সময় ফিল্ড দৃশ্যমানতা নিয়ন্ত্রণ
  • TypeToken — প্যারামিটারাইজড কালেকশনের জন্য টাইপ মুছে ফেলার সমস্যার সমাধান
  • GsonBuilder — ফরম্যাটিং, সংস্করণ, তারিখ এবং কাস্টম অ্যাডাপ্টারের কনফিগারেশন
  • JsonSerializer/JsonDeserializer — অ-মানক লজিক সহ টাইপ পরিচালনার জন্য ইন্টারফেস

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন