Deserializatsiya — JSON, XML yoki Protobuf ma'lumotlar oqimidan obyektni tiklash jarayoni bo'lib, uzoq API bilan ishlaydigan har qanday mobil ilova uchun zarurdir. Apple Developer (2026) ma'lumotlariga ko'ra, kiruvchi ma'lumotlarni noto'g'ri qayta ishlash qurilmalardagi nosozliklarning tez-tez uchraydigan sabablaridan biri bo'lib qolmoqda. iOS-da JSONDecoder va Android-da Gson standart vositalardir, ammo har birining o'ziga xos xususiyatlari va cheklovlari bor.
Asosiy ma'lumotlar
Deserializatsiya — baytlar oqimi yoki tuzilgan matnni dasturlash tili obyektiga aylantirish jarayoni. Mobil ishlab chiqishda bu jarayon ilova serverdan javob olganida har safar sodir bo'ladi: JSON qatori User, Order yoki Product sinfi namunasiga aylanadi. Deserializatsiyaning to'g'riligiga foydalanuvchiga ma'lumotlarni ko'rsatadigan ekranlarning barqarorligi bevosita bog'liq.
Serializatsiya va deserializatsiya — o'zaro teskari jarayonlar, amalda kamdan-kam simmetrik. Serializatsiya obyektni serverga yuborish uchun qatorga aylantiradi, deserializatsiya olingan qatordan obyektni tiklaydi. Server mijoz modelida mavjud bo'lmagan maydonni yuborishi, boshqa sana formatidan foydalanishi yoki raqam o'rniga null qaytarishi mumkin. Square Engineering (2025) ma'lumotlariga ko'ra, format asimmetriyasi Android ilovalarida tarmoq qatlami xatolarining 23% sababidir. Xavfni kamaytirish uchun sxema versiyalash va OpenAPI orqali qattiq shartnoma spetsifikatsiyasi qo'llaniladi.
JSON o'qish qulayligi va o'rnatilgan qo'llab-quvvatlash tufayli mobil API lar uchun eng mashhur format bo'lib qolmoqda. Google dan Protobuf yuqori yuklangan tizimlarda qo'llaniladi — JSON dan 3-6 marta ixcham va tezroq tahlil qilinadi, lekin .proto fayllaridan kod yaratishni talab qiladi va vositalarsiz o'qib bo'lmaydi. XML zamonaviy mobil ilovalarda kamroq uchraydi, ammo korporativ tizimlarning SOAP xizmatlarida va Android konfiguratsiya fayllarida qo'llaniladi. MessagePack — tuzilishiga ko'ra JSON ga o'xshash, ammo ixchamroq ikkilik format, real vaqt tizimlarida mashhur.
Deserializatsiya jarayoni uch bosqichdan o'tadi. Avval tokenizatsiya xom matnni leksemalarga ajratadi: kalitlar, qatorlar, raqamlar va ajratgichlar. Keyin sintaktik tahlil tuzilmaning to'g'riligini tekshiradi — qavslar yopilganmi, tirnoq turi to'g'rimi, format RFC 8259 spetsifikatsiyasiga mos keladimi. Yakuniy bosqich — ilovaning obyekt modeliga moslashtirish, bu erda har bir JSON kalitiga nomlash strategiyasini hisobga olgan holda sinf xususiyati tayinlanadi.
Mobil ishlab chiqishda moslashtirishning ikkita yondashuvi shakllangan. Reflection (Gson, JSONSerialization) sinf tuzilishini Java Reflection API yoki Objective-C runtime orqali ish vaqtida tahlil qiladi — bu moslashuvchan va qo'shimcha konfiguratsiyani talab qilmaydi, ammo sekinroq va ko'proq xotira sarflaydi. Code generation (Moshi codegen, kotlinx.serialization, Codable) kompilyatsiya bosqichida kod yaratadi: tezroq, turlar nuqtai nazaridan xavfsizroq va reflection orqali ichki tuzilmani ochib bermaydi. JetBrains va Square ishlab chiqarish yig'ilishlari uchun code generation ni tavsiya qiladi ‖ Google benchmarklarida unumdorlik o'sishi 2-4 marta.
struct User: Codable {
let id: Int
let name: String
let email: String
let createdAt: Date
}
let json = """
{
"id": 42,
"name": "Alice",
"email": "alice@example.com",
"created_at": "2026-06-01T12:00:00Z"
}
"""
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let user = try decoder.decode(User.self, from: data)
Swift da User modeliga JSON deserializatsiyasi namunasi. convertFromSnakeCase strategiyasi API snake_case kalitlarini avtomatik ravishda modelning camelCase xususiyatlariga aylantiradi — iOS loyihalarida standart amaliyot. data parametri URLSession orqali olingan server javobining xom baytlaridir. try orqali xatolarni boshqarish noto'g'ri JSON ni ilovani buzmasdan ushlash imkonini beradi.
JSONDecoder to'rtta kalit strategiyasini qo'llab-quvvatlaydi: useDefaultKeys (aniq moslik), convertFromSnakeCase (snake_case → camelCase), custom (closure) va convertFromKebabCase (kebab-case → camelCase). Sanalar uchun .iso8601, .secondsSince1970, .millisecondsSince1970 va maxsus dateFormatter mavjud. To'g'ri strategiyani tanlash barqaror deserializatsiyaga birinchi qadam bo'lib, format mos kelmasligi xatolarining ko'pchiligini oldini oladi.
JSONDecoder — Codable protokoli bilan ishlaydigan iOS SDKdagi standart deserializatsiya mexanizmi. JSONDecoder avtomatik ravishda JSON ni struct yoki class namunalariga tahlil qiladi, ichki obyektlarni, massivlarni va ibtidoiy turlarni qo'llab-quvvatlaydi. Maxsus mantiq uchun init(from: Decoder) metodidan foydalaniladi — bu nostandart formatlarni, eski API versiyasida o'tkazib yuborilgan maydonlarni boshqarish yoki bir nechta JSON kalitlarini bitta xususiyatda birlashtirish imkonini beradi.
struct Order: Decodable {
let orderId: String
let amount: Double
let status: OrderStatus
enum OrderStatus: String, Decodable {
case pending, confirmed, shipped, cancelled
}
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let order = try decoder.decode(Order.self, from: jsonData)
DateDecodingStrategy JSONDecoder sanali qatorlarni qanday izohlashini belgilaydi. Eng ko'p .iso8601 ishlatiladi — REST API ning standart formati. Ichma-ich enum OrderStatus JSON qator qiymatlaridan avtomatik dekodlanadi. Bu sehrli raqamlardan qochish va kodni o'zini-o'zi hujjatlashtirish imkonini beradi — buyurtma holati har doim qat'iy belgilangan qiymatlar to'plamiga ega.
Swift 4.2 dan boshlab, Codable alohida xususiyatlarning maxsus deserializatsiyasi uchun property wrappers ni qo'llab-quvvatlaydi. @DefaultValue — JSON da maydon bo'lmasa, standart qiymat o'rnatadigan mashhur wrapper. @LosslessString qatorni raqamga va aksincha aylantiradi. Bu server id ni „123” qator sifatida yuborganda va model Int kutganda ayniqsa foydalidir. Property wrappers init(from:) dagi shablon kodini kamaytiradi va modellarni tozalaydi.
Android-da deserializatsiya kutubxonasini tanlash loyihaning tili va talablariga bog'liq. Google dan Gson — reflection orqali ishlaydigan eng keng tarqalgan variant, ammo murakkab iyerarxiyalarda unumdorlik muammolari bor. Square dan Moshi ham reflection, ham code generation ni qo'llab-quvvatlaydi, kamroq xotira sarflaydi va katta javoblarni tezroq qayta ishlaydi. JetBrains dan kotlinx.serialization — kompilyatorga integratsiyalangan, umuman reflection ishlatmaydigan mahalliy Kotlin yechimi.
@Serializable
data class User(
@SerialName("user_id")
val userId: Int,
val name: String,
val email: String,
@SerialName("created_at")
val createdAt: String
)
val json = Json { ignoreUnknownKeys = true }
val user = json.decodeFromString<User>(response)
@Serializable — sinf uchun kod generatsiyasini faollashtiradigan Kotlin kompilyator annotatsiyasi. ignoreUnknownKeys parametri server modelda mavjud bo'lmagan maydonni yuborganda nosozlikning oldini oladi. snake_case kalitlarini moslashtirish uchun @SerialName ishlatiladi — iOS dagi convertFromSnakeCase ning analogi. JetBrains (2026) ma'lumotlariga ko'ra, kutubxona ko'p platformalilikni qo'llab-quvvatlaydi: bir xil Serializable sinfi Android, iOS (KMP) va server Kotlin da ishlaydi.
Kutubxonalar orasida tanlov tezlik-moslashuvchanlik kelishuviga olib keladi. Gson prototiplar va Java loyihalari uchun yaxshi — annotatsiya talab qilmaydi va „tayyor” ishlaydi. Moshi o'rta pozitsiyani egallaydi: @JsonClass(generateAdapter = true) orqali codegen kotlinx.serialization ga yaqin tezlikni beradi, reflection rejimi esa Gson ning moslashuvchanligini ta'minlaydi. kotlinx.serialization toza Kotlin loyihalari uchun eng tez variantdir, lekin Kotlin 1.4+ va Gradle da Kotlin Serialization plaginini talab qiladi.
| Kutubxona | Mexanizm | Tezlik | KMP |
|---|---|---|---|
| Gson | Reflection | Past | Yo'q |
| Moshi | Reflection / Codegen | O'rta / Yuqori | Yo'q |
| kotlinx.serialization | Compiler codegen | Yuqori | Ha |
Type mismatch — JSON bir turdagi qiymatni o'z ichiga olganida va model boshqa turni kutganida yuzaga keladigan holat. Server raqam o'rniga „42” qatorini yoki boolean true o'rniga 1 raqamini yubordi. iOS da JSONDecoder sukut bo'yicha DecodingError.typeMismatch ni tashlaydi, Android da Gson aylantirishga harakat qiladi, Moshi va kotlinx.serialization esa aniq adapterlarni talab qiladi. Yechim — lenient strategiyalari yoki aniq maydonlar uchun maxsus deserializatorlardan foydalanish.
Server ixtiyoriy maydonni kiritmaganda, kod xato bilan ishdan chiqadi. Swift dagi Optional va Kotlin dagi nullable turlar muammoni hal qiladi: agar maydon null bo'lsa yoki JSON da mavjud bo'lmasa, xususiyat nil/null qiymatini oladi va ilova ishlashda davom etadi. Majburiy maydonlar uchun deserializatsiyadan oldin API mijoz darajasida ularning mavjudligini tekshirish kerak. Moshi va kotlinx.serialization sukut bo'yicha barcha maydonlarni talab qiladi — nullable belgilash va standart qiymatlar bu cheklovni olib tashlaydi.
Serverda JSON tuzilishini o'zgartirish — ishlab chiqarishda nosozliklarning tez-tez uchraydigan manbai. Standart amaliyot — ildiz obyektidagi version maydoni orqali sxema versiyalash va mijoz tomonda 2-3 oldingi versiyani qo'llab-quvvatlash. kotlinx.serialization turli versiyalar uchun bir nechta modellarni e'lon qilish va JsonElement ga dastlabki tahlildan so'ng version maydoni asosida mosini tanlash imkonini beradi. Qo'shimcha himoya — yangi maydonlar uchun ignoreUnknownKeys va olib tashlanishi mumkin bo'lgan maydonlar uchun standart qiymatlar.
| Xato | Alomat | Himoya bilan kutubxona |
|---|---|---|
| Type mismatch | DecodingError / istisno | kotlinx — coerceInputValues = true |
| Maydon yo'qligi | Murojaatda nosozlik | Moshi — @Transient + default |
| Noto'g'ri sana formati | Dekodlash xatosi | JSONDecoder — dateDecodingStrategy |
| Qo'shimcha maydonlar | E'tiborga olinmaydi yoki nosozlik | kotlinx — ignoreUnknownKeys = true |
| Non-null maydonda null | Ish vaqtida nosozlik | Moshi — lenient + @Nullable |
Deserializatsiya xatolarini qayd etish — ishlab chiqarishda majburiy amaliyot. decode ni do/catch ga o'rang, xom JSON va kutilayotgan model turini Crashlytics yoki Sentry da qayd eting. Bu qaysi API ning qaysi maydoni va ilovaning qaysi versiyasida buzilganini tez aniqlash imkonini beradi. Qayd etishsiz, deserializatsiya xatosi kontekstsiz sirli nosozlik kabi ko'rinadi.
Tez-tez beriladigan savollar
Parsing — majburiy tiplangan model yaratmasdan tuzilgan matnni tarkibiy qismlarga ajratish. Deserializatsiya parsingning alohida holati bo'lib, natijasi ma'lum turdagi xususiyatlarga ega to'liq huquqli til obyektidir. Parsing oqimli bo'lishi mumkin, deserializatsiya har doim to'liq obyekt yaratadi.
Toza Kotlin loyihasi uchun kotlinx.serialization tavsiya etiladi — kompilyatorga integratsiyalangan, reflection ishlatmaydi va Kotlin Multiplatform ni qo'llab-quvvatlaydi. Mavjud Java loyihasi uchun — code generation bilan Moshi. Gson ni o'zgartirish katta kuch talab qiladigan eski loyihalar uchun qoldirish yaxshiroq.
iOS da JSONDecoder da keyDecodingStrategy = .convertFromSnakeCase dan foydalaning. Android da kotlinx.serialization da har bir maydon uchun @SerialName dan foydalaning. Moshi da @Json(name=„field_name”) yoki global JsonAdapter.Factory ni qo'llang. Loyiha darajasida yagona uslub — API shartnomasida kelishilgan best practice.
Eng ko'p uchraydigan sabab — majburiy deb e'lon qilingan maydonda serverdan kutilmagan null. Ishlab chiqishda server to'liq ma'lumotlarni qaytaradi, ishlab chiqarishda — qisqartirilgan javob. Yechim: barcha potensial yo'q maydonlarni nullable (Kotlin) yoki optional (Swift) deb belgilang, ignoreUnknownKeys va standart qiymatlardan foydalaning.
Code generation (Moshi codegen, kotlinx.serialization, Codable) Google benchmarklarida reflection dan 2-4 marta tez ishlaydi. Tezlikdan tashqari, kod generatsiyasi turlar nuqtai nazaridan xavfsizroq, ish vaqtida sinf metama'lumotlarini talab qilmaydi va tur xatolari deserializatsiya paytida emas, balki kompilyatsiya bosqichida aniqlanadi.
Xulosa
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.