Gson — bu nima, Java va Kotlin uchun JSON kutubxonasi

Muallif: IT Sectr Nashr etilgan: 2026-03-15 O'qish vaqti: 8 daq

Gson — Google tomonidan Java ob'ektlarini JSON-ga va orqaga serializatsiya qilish uchun kutubxona, Android dasturlashda keng qo'llaniladi. U murakkab ob'ekt graflarini qo'lda parser yozmasdan ixcham JSON qatorlariga aylantirish imkonini beradi. Google Gson, 2024 ma'lumotlariga ko'ra, kutubxona GitHub-da 23 mingdan ortiq yulduzga ega va Java va Kotlin ekotizimida JSON bilan ishlash uchun eng mashhur yechimlardan biri bo'lib qolmoqda.

Asosiy fikrlar

  • Gson — Google-ning Java va Kotlin-da JSON serializatsiyasi uchun kutubxonasi
  • fromJson — JSON-ni istalgan turdagi Java ob'ektiga deserializatsiya qilish
  • toJson — ob'ektni JSON qatoriga serializatsiya qilish
  • @SerializedName — JSON kalitini sinf maydoniga bog'lash uchun annotatsiya
  • TypeToken — generiklar va parametrlangan turlar bilan ishlash

Gson nima

Gson — Google tomonidan ishlab chiqilgan, ob'ektlarni JSON ko'rinishiga va orqaga aylantirish uchun Java kutubxonasi. U sinflar strukturasini tahlil qilish uchun refleksiyadan foydalanadi, bu esa dastlabki sozlashsiz ishlash imkonini beradi. Gson ixtiyoriy Java ob'ektlarini, kolleksiyalarni, massivlarni, generiklarni va ichma-ich sinflarni qo'llab-quvvatlaydi. Kutubxona asosiy foydalanish uchun annotatsiyalarni talab qilmaydi, lekin nozik sozlash uchun ularni taqdim etadi. Refleksiyaning asosiy kamchiligi — ishga tushirishda unumdorlikning pasayishi va kompilyatsiya bosqichida optimallashtirishning mumkin emasligi, bu ayniqsa Android ilovasining sovuq startida yuzlab modellarni deserializatsiya qilishda seziladi. Shunga qaramay, Gson barqarorligi va keng hujjatlari tufayli ko'pchilik loyihalar uchun ishonchli tanlov bo'lib qolmoqda.

Ekotizimda tarix va o'rin

Gson Google tomonidan 2008-yilda chiqarilgan va tezda Android ilovalarida JSON uchun de-fakto standartga aylandi. Moshi va kotlinx.serialization paydo bo'lishidan oldin Gson Kotlin loyihalari uchun yagona mashhur tanlov bo'lib qoldi. Ulanish soddaligi — build.gradle-ga bitta bog'liqlik qo'shish — va majburiy annotatsiyalarning yo'qligi Gson-ni har qanday darajadagi dasturchilar orasida mashhur qildi.

groovy
// Gson-ni build.gradle-ga qo'shish
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

// Asosiy foydalanish
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"}

Asosiy serializatsiyadan tashqari, Gson xatti-harakatni sozlash uchun GsonBuilder ni taqdim etadi: sanalarni formatlash, HTML escape-ni o'chirish, kalitlar registri va maxsus instansiyalar. GsonBuilder shuningdek, kutubxona avtomatik qayta ishlay olmaydigan turlar uchun maxsus JsonSerializer va JsonDeserializer ro'yxatdan o'tkazish imkonini beradi. Sozlash moslashuvchanligi GsonBuilder-ni zamonaviy Android dasturlashda kutubxonani loyihaning o'ziga xos talablariga moslashtirishda ajralmas va foydali vositaga aylantiradi.

Asosiy operatsiyalar toJson va fromJson

toJson Java ob'ektini JSON qatoriga aylantiradi, uning maydonlarini refleksiya orqali tahlil qiladi. Sukut bo'yicha Gson transient va static dan tashqari barcha maydonlarni o'z ichiga oladi. Metod istalgan turlarni qo'llab-quvvatlaydi: primitivlar, ob'ektlar, kolleksiyalar va massivlar. fromJson teskari konvertatsiyani amalga oshiradi, JSON qatorini va maqsadli ob'ekt sinfini qabul qiladi va maydonlari to'ldirilgan instansiyani qaytaradi.

Ob'ektni JSON-ga aylantirish

Serializatsiya paytida Gson ob'ektning barcha maydonlarini, shu jumladan ichma-ich maydonlarni rekursiv ravishda aylanib chiqadi. Tsiklik havolalar StackOverflowError-ga olib keladi, shuning uchun ularni @Expose annotatsiyasi yoki maxsus adapter orqali chiqarib tashlash kerak. Kolleksiyalar uchun Gson elementlarning turini saqlaydi, ammo generiklar bilan ro'yxatni deserializatsiya qilishda tur haqidagi ma'lumotni saqlash uchun TypeToken talab qilinadi.

kotlin
// ichma-ich ob'ekt bilan 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-ga serializatsiya
val json = gson.toJson(employee)

// JSON-dan deserializatsiya
val jsonString = """
{"id":2,"name":"Bob","address":{"city":"London","street":"Baker St"}}
"""
val parsed = gson.fromJson(jsonString, Employee::class.java)

Annotatsiyalar va sozlash

Gson serializatsiya jarayonini boshqarish uchun annotatsiyalar to'plamini taqdim etadi. @SerializedName maydon nomidan farq qiluvchi JSON kaliti nomini belgilaydi. @Expose maydonning serializatsiyaga kiritilishini boshqaradi: GsonBuilder.excludeFieldsWithoutExposeAnnotation() orqali yaratilgan Gson faqat @Expose bilan maydonlarni qayta ishlaydi. @Since va @Until maydonlarning versiyalanishini nazorat qiladi.

@SerializedName va @Expose

@SerializedName annotatsiyasi nomlar nomutanosibligi muammosini hal qiladi: server snake_case ishlatishi mumkin, kodda esa camelCase qabul qilingan. Annotatsiya qiymat va orqaga moslik uchun ixtiyoriy alternativlarni qabul qiladi. @Expose maxfiy maydonlarni (parollar, tokenlar) @Expose(serialize = false) deb belgilab, serializatsiyadan yashirish imkonini beradi. Kiritish va chiqarishdan tashqari, @Expose GsonBuilder.excludeFieldsWithoutExposeAnnotation bilan birlashtirilib, maydonlarning oq ro'yxatini yaratish mumkin, bu ko'p sonli maydonlarga ega ob'ektlarni serializatsiya qilishda hujum yuzasini boshqarishga yordam beradi.

kotlin
// Gson annotatsiyalari bilan model
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 filtri bilan Gson
val gson = GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .setPrettyPrinting()
    .create()

val user = UserResponse(1, "John", "secret123")
println(gson.toJson(user))
// {"user_id":1,"full_name":"John"} — password excluded

Generiklar bilan ishlash

Generiklar muammosi Java va Kotlin-da kompilyatsiya vaqtida turlarning o'chirilishidan iborat. Gson List<User> ni deserializatsiya qilganda, element turini bilmaydi va List<Map<String, Any>> qaytaradi. Tur haqidagi ma'lumotni saqlash uchun Gson TypeToken — anonim sinf orqali tur parametrini tutuvchi abstrakt sinfni taqdim etadi. TypeToken bo'lmasa, dasturchi har bir elementni Map-dan maqsadli turga qo'lda aylantirishi kerak bo'ladi, bu esa katta kod va unumdorlik yo'qotilishiga olib keladi.

Ro'yxatlar uchun TypeToken

TypeToken turlarning o'chirilishi muammosini hal qiladi. Dasturchi kerakli tur parametri bilan anonim TypeToken vorisini yaratadi va Gson to'g'ri deserializatsiya uchun sinf imzosidagi ma'lumotdan foydalanadi. TypeToken shuningdek Map, Set va ichma-ich generiklar hamda boshqa har qanday parametrlangan turlar bilan ishlaydi. Xususan, Map<String, List<User>> uchun ichma-ich turning to'liq imzosi bilan TypeToken talab qilinadi, aks holda Gson qiymatlarni List<User> o'rniga List<Map<String, Any>> sifatida deserializatsiya qiladi.

kotlin
// Ro'yxatni deserializatsiya qilish uchun 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)

// Maxsus deserializator
class LocalDateAdapter :
    JsonDeserializer<LocalDate> {

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

Maxsus serializatsiya mantig'i uchun Gson JsonSerializer va JsonDeserializer interfeyslarini qo'llab-quvvatlaydi. Ular GsonBuilder.registerTypeAdapter() orqali ro'yxatdan o'tkaziladi va kutubxona avtomatik serializatsiya qila olmaydigan turlarni qayta ishlash imkonini beradi: Java 8 sanalari, nostandart qiymatlarga ega Enum yoki manba kodiga kirish imkoni bo'lmagan uchinchi tomon sinflari. Adapterni amalga oshirishda unumdorlikni kuzatish muhim: maxsus adapter ichida refleksiya chaqiruvi qo'lda boshqarishning afzalliklarini bekor qiladi, shuning uchun to'g'ridan-to'g'ri metod va maydon chaqiruvlariga ustunlik beriladi. Gson ekotizimida shuningdek UUID, Optional va Joda-Time sana turlari kabi keng tarqalgan turlar uchun adapterlarni taqdim etuvchi gson-extras moduli mavjud.

GsonBuilder orqali sozlash

GsonBuilder serializatsiyani nozik sozlash uchun o'nlab metodlarni taqdim etadi. setPrettyPrinting chiqish JSON-ga o'qilishi uchun chekinish va yangi qatorlar qo'shadi. disableHtmlEscaping qatorlardagi HTML belgilarining escape qilinishini o'chiradi. setDateFormat sanalar formatini belgilaydi, bu nostandart vaqt ko'rinishidan foydalanadigan serverlar bilan ishlashda muhimdir. setLenient JSON formatlashdagi ba'zi xatolarni e'tiborsiz qoldiradigan yumshoq tahlil rejimini yoqadi. addDeserializationExclusionStrategy maxsus strategiyalar asosida maydonlarni deserializatsiyadan dasturiy ravishda chiqarib tashlash imkonini beradi. Disk raskadrovka uchun setPrettyPrinting metodi logging bilan birgalikda foydalidir — JSON javoblarini loglarda o'qiladigan qiladi va nomuvofiqliklarni topishni osonlashtiradi.

GsonBuilder-ning muhim imkoniyati @Since va @Until annotatsiyalari orqali maydonlarning versiyalanishini boshqarishdir. Dasturchi setVersion orqali ob'ektning versiyasini belgilaydi va Gson versiya annotatsiyasiga qarab maydonlarni avtomatik kiritadi yoki chiqaradi. Bu API evolyutsiyasida, bir xil model server protokolining turli versiyalari uchun ishlatilganda foydalidir. GsonBuilder shuningdek tur oilalarini global qayta ishlash uchun TypeAdapterFactory ro'yxatdan o'tkazishni va murakkab Map kalitlari bilan to'g'ri ishlash uchun complexMapKeySerialization ni qo'llab-quvvatlaydi.

Tez-tez beriladigan savollar

Android dasturlashda Gson nima?

Gson — Google-ning Java ob'ektlarini JSON-ga va orqaga aylantirish uchun kutubxonasi. U server javoblarini tahlil qilish, so'rovlarni serializatsiya qilish va ma'lumotlarni mahalliy xotirada saqlash uchun Android ilovalarida keng qo'llaniladi.

Gson null qiymatlarini qanday qayta ishlaydi?

Sukut bo'yicha Gson serializatsiya paytida null maydonlarni o'tkazib yuboradi. Null qiymatlarini yoqish uchun GsonBuilder.serializeNulls() dan foydalaning. Deserializatsiya paytida JSON-da mavjud bo'lmagan maydonlar null bo'lib qoladi yoki tur uchun sukut qiymatini oladi.

Gson Moshi-dan qanday farq qiladi?

Moshi Kotlin sinflari uchun refleksiyadan foydalanmaydi, bu esa yuqori unumdorlik va bashorat qilinadigan xatti-harakatni ta'minlaydi. Moshi shuningdek Kotlin-ning null-xavfsizligini to'g'ri qayta ishlaydi, Gson esa null-ni non-null maydoniga deserializatsiya qilib, istisno keltirib chiqarishi mumkin.

Gson-da @SerializedName qanday ishlaydi?

@SerializedName JSON kalitini sinf maydoni bilan bog'laydi, nomlar mos kelmaganda. Masalan, kotlinName maydoni va “kotlin_name” JSON kaliti uchun @SerializedName(“kotlin_name”) annotatsiyasi to'g'ri konvertatsiyani ta'minlaydi.

Gson-da TypeToken nima?

TypeToken — anonim sinf orqali tur parametrini tutuvchi abstrakt sinfdir. U kolleksiyalar va boshqa parametrlangan turlarni deserializatsiya qilish uchun zarur, chunki turlarning o'chirilishi sababli Gson ish vaqtida element turini tiklay olmaydi.

Xulosa

  • Gson — Java va Kotlin qo'llab-quvvatlashi bilan JSON serializatsiyasi uchun Google kutubxonasi
  • toJson va fromJson — ob'ektlarni serializatsiya va deserializatsiya qilish uchun asosiy metodlar
  • @SerializedName — nomlar mos kelmaganda maydonlarni JSON kalitlari bilan moslashtirish uchun annotatsiya
  • @Expose — GsonBuilder orqali serializatsiya paytida maydonlarning ko'rinishini boshqarish
  • TypeToken — parametrlangan kolleksiyalar uchun tur o'chirilishi muammosining yechimi
  • GsonBuilder — formatlash, versiyalash, sanalar va maxsus adapterlarni sozlash
  • JsonSerializer/JsonDeserializer — nostandart mantiq bilan turlarni qayta ishlash uchun interfeyslar

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing