Deserializatsiya: bu nima, ma'lumotlarni tiklash jarayoni

Muallif: IT Sectr Nashr etilgan: 2026-03-08 O'qish vaqti: 9 daq

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 — koddan foydalanish uchun JSON, XML yoki Protobuf dan tiplangan obyektni tiklash.
  • Codable — Swift-da kod generatsiyasini qo'llab-quvvatlagan holda avtomatik deserializatsiya uchun Apple protokoli.
  • Moshi — turli stsenariylar uchun codegen va reflection opsiyalari bilan Square dan Android kutubxonasi.
  • Type mismatch — JSON maydonlari turlari va model xususiyatlari mos kelmaganda eng keng tarqalgan xato.
  • kotlinx.serialization — xavfsiz kodning kompilyator generatsiyasi bilan JetBrains ning rasmiy yechimi.

Deserializatsiya nima?

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.

Serializatsiyadan farqi

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.

Deserializatsiya uchun ma'lumot formatlari

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 qanday ishlaydi

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.

Reflection va Code generation

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.

swift
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.

Dekodlash strategiyalarining roli

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.

iOS-da deserializatsiya

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.

swift
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.

Codable da Property Wrappers

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

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.

kotlin
@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.

Gson, Moshi va kotlinx.serialization solishtirish

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.

KutubxonaMexanizmTezlikKMP
GsonReflectionPastYo'q
MoshiReflection / CodegenO'rta / YuqoriYo'q
kotlinx.serializationCompiler codegenYuqoriHa

Oddiy xatolar va ularning oldini olish

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.

Yetishmayotgan maydonlar va nullable

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.

API versiyalarining mos kelmasligi

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.

XatoAlomatHimoya bilan kutubxona
Type mismatchDecodingError / istisnokotlinx — coerceInputValues = true
Maydon yo'qligiMurojaatda nosozlikMoshi — @Transient + default
Noto'g'ri sana formatiDekodlash xatosiJSONDecoder — dateDecodingStrategy
Qo'shimcha maydonlarE'tiborga olinmaydi yoki nosozlikkotlinx — ignoreUnknownKeys = true
Non-null maydonda nullIsh vaqtida nosozlikMoshi — 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

Deserializatsiya parsingdan nimasi bilan farq qiladi?

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.

Yangi Android loyihasi uchun qaysi deserializatsiya kutubxonasini tanlash kerak?

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.

Server snake_case yuborsa, model esa camelCase bo'lsa nima qilish kerak?

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.

Nima uchun deserializatsiya ishlab chiqishda emas, balki ishlab chiqarishda nosozlikka sabab bo'ladi?

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.

Deserializatsiyada qaysi biri tezroq — Reflection yoki Code generation?

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

  • Deserializatsiya — ilova kodida foydalanish uchun JSON, XML yoki Protobuf dan obyektni tiklaydigan mobil ishlab chiqishning asosiy jarayoni.
  • iOS JSONDecoder dan Codable protokoli bilan foydalanadi, kalit va sana strategiyalari bilan JSON dan modelga avtomatik aylantirishni ta'minlaydi.
  • Android uchta vositani taklif qiladi: Gson (reflection), Moshi (reflection/codegen) va kotlinx.serialization (@Serializable orqali kompilyator generatsiyasi).
  • Oddiy xatolar — type mismatch, yetishmayotgan maydonlar, non-null maydonlarda null va API versiyalarining mos kelmasligi — nullable turlar, ignoreUnknownKeys va versiyalash bilan oldini olinadi.
  • Code generation reflection dan xavfsizroq va tezroq, shuning uchun mobil ilovalarning ishlab chiqarish yig'ilishlari uchun tavsiya etiladi.
  • Moslashtirish strategiyasi — iOS da keyDecodingStrategy va Android da @SerialName server va mijoz o'rtasidagi nomlash uslubi mos kelmasligi muammosini hal qiladi.
  • Deserializatsiya xatolarini ishlab chiqarish hodisalarini tez diagnostika qilish uchun Crashlytics yoki Sentry da qayd etish majburiydir.

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