Deserializasiya — uzaq API ilə işləyən istənilən mobil tətbiq üçün zəruri olan JSON, XML və ya Protobuf məlumat axınından obyektin bərpa edilməsi prosesidir. Apple Developer (2026) məlumatlarına görə, daxil olan məlumatların səhv emalı cihazlardakı çökmələrin tez-tez rast gəlinən səbəblərindən biri olaraq qalır. iOS-da JSONDecoder və Android-də Gson standart alətlərdir, lakin hər birinin öz xüsusiyyətləri və məhdudiyyətləri var.
Əsas məqamlar
Deserializasiya — bayt axınının və ya strukturlaşdırılmış mətnin proqramlaşdırma dili obyektinə çevrilməsi prosesidir. Mobil inkişafda bu proses tətbiq serverdən cavab aldıqda hər dəfə baş verir: JSON sətri User, Order və ya Product sinifinin nümunəsinə çevrilir. Deserializasiyanın düzgünlüyü istifadəçiyə məlumat göstərən ekranların sabitliyinə birbaşa təsir edir.
Serializasiya və deserializasiya — qarşılıqlı tərs proseslərdir, praktikada nadir hallarda simmetrik olur. Serializasiya obyekti serverə göndərmək üçün sətrə çevirir, deserializasiya isə alınan sətrdən obyekti bərpa edir. Server müştəri modelində olmayan sahə göndərə, başqa tarix formatından istifadə edə və ya rəqəm əvəzinə null qaytara bilər. Square Engineering (2025) məlumatlarına görə, format asimmetriyası Android tətbiqlərində şəbəkə qatı səhvlərinin 23%-nin səbəbidir. Riski azaltmaq üçün sxem versiyalaşdırma və OpenAPI vasitəsilə ciddi müqavilə spesifikasiyası tətbiq edilir.
JSON oxunaqlılığı və daxili dəstəyi sayəsində mobil API-lər üçün ən populyar format olaraq qalır. Google-dan Protobuf yüksək yüklü sistemlərdə istifadə olunur — JSON-dan 3-6 dəfə yığcam və daha sürətli pars edilir, lakin .proto fayllarından kod yaradılması tələb edir və alətsiz oxuna bilməz. XML müasir mobil tətbiqlərdə daha az rast gəlinir, lakin korporativ sistemlərin SOAP xidmətlərində və Android konfiqurasiya fayllarında tətbiq olunur. MessagePack — quruluşuna görə JSON-a bənzəyən, lakin daha yığcam olan ikili format, real vaxt sistemlərində məşhurdur.
Deserializasiya prosesi üç mərhələdən keçir. Əvvəlcə tokenizasiya xam mətni leksemlərə ayırır: açarlar, sətrlər, rəqəmlər və ayırıcılar. Sonra sintaktik analiz quruluşun düzgünlüyünü yoxlayır — mötərizələrin bağlı olub-olmaması, dırnaq işərəsinin növünün düzgünlüyü, formatın RFC 8259 spesifikasiyasına uyğunluğu. Son mərhələ mapinq — tətbiqin obyekt modelinə, burada hər JSON açarına adlandırma strategiyası nəzərə alınmaqla sinifin xüsusiyyəti təyin edilir.
Mobil inkişafda mapinq üçün iki yanaşma formalaşıb. Reflection (Gson, JSONSerialization) sinifin strukturunu Java Reflection API və ya Objective-C runtime vasitəsilə iş vaxtı təhlil edir — bu çevikdir və əlavə konfiqurasiya tələb etmir, lakin daha yavaşdır və daha çox yaddaş sərf edir. Code generation (Moshi codegen, kotlinx.serialization, Codable) kompilyasiya mərhələsində kod yaradır: daha sürətli, tiplər baxımından daha təhlükəsiz və reflection vasitəsilə daxili quruluşu açıqlamır. JetBrains və Square istehsal qurğuları üçün code generation tövsiyə edir — Google benchmarklarında performans artışı 2-4 dəfəyə çatır.
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-də User modelinə JSON deserializasiyası nümunəsi. convertFromSnakeCase strategiyası API-nin snake_case açarlarını avtomatik olaraq modelin camelCase xüsusiyyətlərinə çevirir — iOS layihələrində standart təcrübə. data parametri URLSession vasitƏlsilə alınan server cavabının xam baytlarıdır. try vasitəsilə səhv idarəetməsi tətbiqi çöküşə uğratmadan yanlış JSON tutmağa imkan verir.
JSONDecoder dörd açar strategiyasını dəstəkləyir: useDefaultKeys (dəqiq uyğunluq), convertFromSnakeCase (snake_case → camelCase), custom (closure) və convertFromKebabCase (kebab-case → camelCase). Tarixlər üçün .iso8601, .secondsSince1970, .millisecondsSince1970 və xüsusi dateFormatter nəzərdə tutulub. Düzgün strategiyanın seçilməsi sabit deserializasiyaya doğru ilk addımdır və format uyğunsuzluğu səhvlərinin əksəriyyətinin qarşısını alır.
JSONDecoder — Codable protokolu ilə işləyən iOS SDK-da standart deserializasiya mexanizmidir. JSONDecoder avtomatik olaraq JSON-u struct və ya class nümunələrinə pars edir, iç-içə obyektləri, massivləri və primitiv tipləri dəstəkləyir. Xüsusi məntiq üçün init(from: Decoder) metodundan istifadə olunur — bu, qeyri-standart formatları, köhnə API versiyasında buraxılmış sahələri idarə etməyə və ya bir neçə JSON açarını bir xüsusiyyətdə birləşdirməyə imkan verir.
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-in tarixlər olan sətrləri necə şərh etdiyini müyənləşdirir. Ən çox .iso8601 istifadə olunur — REST API-ün standart formatı. İç-içə enum OrderStatus JSON sətr dəyərlərindən avtomatik dekodlanır. Bu, sehrli rəqəmlərdən qaçınmağa və kodu özünü sənədləşdirən etməyə imkan verir — sifariş statusu hər zaman ciddi müyən edilmiş dəyərlər toplusuna malikdir.
Swift 4.2-dən etibarən, Codable ayrı-ayrı xüsusiyyətlərin xüsusi deserializasiyası üçün property wrappers dəstəkləyir. @DefaultValue — JSON-da sahə yoxdursa, standart dəyər təyin edən məşhur wrapper. @LosslessString sətri rəqəmə və əksinə çevirir. Bu, server id-ni sətr şəklində „123” göndərdikdə və model Int gözlədikdə xüsusilə faydalıdır. Property wrappers init(from:)-də şablon kodunu azaldır və modelləri təmizləyir.
Android-də deserializasiya kitabxanasının seçimi layihənin dilindən və tələblərindən asılıdır. Google-dan Gson — reflection vasitəsilə işləyən ən geniş yayılmış variant, lakin mürəkkəb iyerarxiyalarda performans problemləri var. Square-dən Moshi həm reflection, həm də code generation dəstəkləyir, daha az yaddaş sərf edir və böyük cavabları daha sürətli emal edir. JetBrains-dən kotlinx.serialization — kompilyatora inteqrasiya olunmuş, heç reflection istifadə etməyən yerli Kotlin həllidir.
@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 — sinif üçün kod generasiyasını aktivləşdirən Kotlin kompilyator annotasiyası. ignoreUnknownKeys parametri server modeldə olmayan sahə göndərdikdə çöküşün qarşısını alır. snake_case açarlarının mapinqi üçün @SerialName istifadə olunur — iOS-dakı convertFromSnakeCase-in analoqu. JetBrains (2026) məlumatlarına görə, kitabxana çoxplatformalılığı dəstəkləyir: eyni Serializable sinfi Android, iOS (KMP) və server Kotlin-də işləyir.
Kitabxanalar arasında seçim sürət-çeviklik kompromisinə gəlir. Gson prototiplər və Java layihələri üçün yaxşıdır — annotasiya tələb etmir və „hazır” işləyir. Moshi orta mövqe tutur: @JsonClass(generateAdapter = true) vasitəsilə codegen kotlinx.serialization-a yaxın sürət verir, reflection rejimi isə Gson-un çevikliyini təmin edir. kotlinx.serialization təmiz Kotlin layihələri üçün ən sürətli variantdır, lakin Kotlin 1.4+ və Gradle-də Kotlin Serialization plaginini tələb edir.
| Kitabxana | Mexanizm | Sürət | KMP |
|---|---|---|---|
| Gson | Reflection | Aşağı | Xeyr |
| Moshi | Reflection / Codegen | Orta / Yüksək | Xeyr |
| kotlinx.serialization | Compiler codegen | Yüksək | Bəli |
Type mismatch — JSON bir tipin dəyərini ehtiva etdikdə, model isə başqa tip gözlədikdə yaranan vəziyyət. Server rəqəm əvəzinə „42” sətrini və ya boolean true əvəzinə 1 rəqəmini göndərdi. iOS-da JSONDecoder standart olaraq DecodingError.typeMismatch atacaq, Android-də Gson çevirməyə çalışacaq, Moshi və kotlinx.serialization isə açıq adapterlər tələb edir. Həll — lenient strategiyalarından və ya konkret sahələr üçün xüsusi deserializatorlardan istifadə etmək.
Server isteğə bağlı sahəni daxil etmədikdə, kod səhvlə və çökür. Swift-də Optional və Kotlin-də nullable tiplər problemi həll edir: sahə null və ya JSON-da yoxdursa, xüsusiyyət nil/null dəyərini alır və tətbiq işləməyə davam edir. Məcburi sahələr üçün deserializasiyadan əvvəl API müştərisi səviyyəsində onların mövcudluğunu yoxlamağa dəyər. Moshi və kotlinx.serialization standart olaraq bütün sahələri tələb edir — nullable işaretləməsi və standart dəyərlər bu məhdudiyyəti aradan qaldırır.
Serverdə JSON strukturunun dəyişdirilməsi — istehsalatda çöküşlərin tez-tez rast gəlinən mənbəyidir. Standart təcrübə kök obyektdə version sahəsi vasitəsilə sxem versiyalaşdırma və müştəri tərəfində 2-3 əvvəlki versiyanın dəstəklənməsidir. kotlinx.serialization müxtəlif versiyalar üçün bir neçə model elan etməyə və JsonElement-ə ilkin parslamadan sonra version sahəsi əsasında uyğunu seçməyə imkan verir. Əlavə qoruma — yeni sahələr üçün ignoreUnknownKeys və silinə biləcək sahələr üçün standart dəyərlər.
| Səhv | Simptom | Qoruma ilə kitabxana |
|---|---|---|
| Type mismatch | DecodingError / istisna | kotlinx — coerceInputValues = true |
| Sahənin olmaması | Müraciətdə çöküş | Moshi — @Transient + default |
| Yanlış tarix formatı | Dekodlama səhvi | JSONDecoder — dateDecodingStrategy |
| Əlavə sahələr | Nəzərdən qaçırılır və ya çöküş | kotlinx — ignoreUnknownKeys = true |
| Non-null sahədə null | İş vaxtı çöküşü | Moshi — lenient + @Nullable |
Deserializasiya səhvlərinin qeydiyyatı — istehsalatda məcburi təcrübədir. decode-u do/catch ilə əhatə edin, xam JSON-u və gözlənilən modelin tipini Crashlytics və ya Sentry-də qeyd edin. Bu, hansı API-nin hansı sahəsinin və tətbiqin hansı versiyasında xarab olduğunu tez müyən etməyə imkan verir. Qeydiyyat olmadan deserializasiya səhvi kontekstsiz sirli çöküş kimi görünür.
Tez-tez verilən suallar
Parsing — məcburi tipləşdirilmiş model yaratmadan strukturlaşdırılmış mətnin tərkib hissələrinə ayrılmasıdır. Deserializasiya parsingin xüsusi halıdır, nəticəsi məlum tip xüsusiyyətləri olan tamhüquqlu dil obyektidir. Parsing axınlı ola bilər, deserializasiya hər zaman tam obyekt yaradır.
Təmiz Kotlin layihəsi üçün kotlinx.serialization tövsiyə olunur — kompilyatora inteqrasiya olunub, reflection istifadə etmir və Kotlin Multiplatform dəstəkləyir. Mövcud Java layihəsi üçün — code generation ilə Moshi. Gson-u dəyişdirilməsi əhəmiyyətli əmək tələb edəcək legacy layihələr üçün buraxmaq daha yaxşıdır.
iOS-da JSONDecoder-də keyDecodingStrategy = .convertFromSnakeCase istifadə edin. Android-də kotlinx.serialization-da hər sahə üçün @SerialName istifadə edin. Moshi-də @Json(name=„field_name”) və ya qlobal JsonAdapter.Factory tətbiq edin. Layihə səviyyəsində vahid stil — API müqaviləsində razılaşdırılmış best practice-dir.
Ən çox səbəb məcburi elan edilmiş sahədə serverdən gözlənməyən null-dur. İnkişafda server tam məlumat qaytarır, istehsalatda isə qısaldılmış cavab. Həll: potensial olmayan bütün sahələri nullable (Kotlin) və ya optional (Swift) olaraq işaretləyin, ignoreUnknownKeys və standart dəyərlərdən istifadə edin.
Code generation (Moshi codegen, kotlinx.serialization, Codable) Google benchmarklarında reflection-dan 2-4 dəfə sürətli işləyir. Sürətdən əlavə, kod generasiyası tiplər baxımından daha təhlükəsizdir, iş vaxtı sinif metadatası tələb etmir və tip səhvləri deserializasiya anında deyil, kompilyasiya mərhələsində aşkarlanır.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun