A deszerializáció az objektum visszaállításának folyamata JSON, XML vagy Protobuf adatfolyamból, amely minden távoli API-val kommunikáló mobilalkalmazás számára elengedhetetlen. Az Apple Developer (2026) adatai szerint a beérkező adatok helytelen feldolgozása továbbra is az eszközökön történő összeomlások gyakori okai közé tartozik. Az iOS rendszeren a JSONDecoder és Androidon a Gson szabványos eszközök, de mindegyiknek megvannak a maga jellemzői és korlátai.
Főbb pontok
Deszerializáció — a bájtfolyam vagy strukturált szöveg programozási nyelvi objektummá alakításának folyamata. A mobil fejlesztésben ez a folyamat minden alkalommal lejátszódik, amikor az alkalmazás választ kap a szervertől: a JSON sztring a User, Order vagy Product osztály egy példányává alakul. A felhasználó számára adatokat megjelenítő képernyők stabilitása közvetlenül függ a deszerializáció helyességétől.
A szerializáció és a deszerializáció egymással ellentétes folyamatok, a gyakorlatban ritkán szimmetrikusak. Szerializáció az objektumot sztringgé alakítja a szerverre történő küldéshez, a deszerializáció visszaállítja az objektumot a kapott sztringből. A szerver küldhet olyan mezőt, ami nem létezik a kliens modellben, használhat más dátumformátumot, vagy null-t adhat vissza szám helyett. A Square Engineering (2025) adatai szerint a formátumok aszimmetriája az Android alkalmazások hálózati rétegében fellépő hibák 23%-áért felelős. A kockázat csökkentése érdekében sémaverziózást és szigorú szerződéses specifikációt alkalmaznak OpenAPI-n keresztül.
A JSON továbbra is a legnépszerűbb formátum a mobil API-k számára az olvashatósága és a beépített támogatása miatt. A Google Protobuf-ját nagy terhelésű rendszerekben használják — 3-6-szor tömörebb, mint a JSON és gyorsabban elemezhető, de .proto fájlokból kell kódot generálni, és eszközök nélkül olvashatatlan. Az XML ritkábban fordul elő modern mobilalkalmazásokban, de használják vállalati rendszerek SOAP szolgáltatásaiban és Android konfigurációs fájlokban. A MessagePack — bináris formátum, szerkezetében hasonlít a JSON-hoz, de tömörebb, népszerű a valós idejű rendszerekben.
A deszerializációs folyamat három szakaszon megy keresztül. Először a tokenizáció lexémákra bontja a nyers szöveget: kulcsokra, sztringekre, számokra és elválasztókra. Ezután a szintaktikai elemzés ellenőrzi a szerkezet helyességét — hogy a zárójelek zárva vannak-e, hogy az idézőjel típusa helyes-e, hogy a formátum megfelel-e az RFC 8259 szabványnak. A végső szakasz a leképezés az alkalmazás objektummodelljére, ahol minden JSON kulcshoz az osztály egy tulajdonsága rendelődik hozzá, figyelembe véve az elnevezési stratégiát.
A mobil fejlesztésben két megközelítés alakult ki a leképezésre. A Reflection (Gson, JSONSerialization) futási időben elemzi az osztály szerkezetét a Java Reflection API-n vagy Objective-C runtime-on keresztül — rugalmas és nem igényel további konfigurációt, de lassabb és több memóriát fogyaszt. A Code generation (Moshi codegen, kotlinx.serialization, Codable) fordítási fázisban generál kódot: gyorsabb, típusbiztosabb és nem teszi közzé a belső szerkezetet reflection útján. A JetBrains és a Square a code generation-t ajánlja éles verziókhoz — a teljesítménynövekedés a Google benchmarkjaiban eléri a 2-4-szeresét.
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)
Példa JSON deszerializációra User modellbe Swiftben. A convertFromSnakeCase stratégia automatikusan átalakítja a snake_case API kulcsokat a modell camelCase tulajdonságaivá — szabványos gyakorlat iOS projektekben. A data paraméter a szerver válaszának nyers bájtjai, amelyeket URLSession útján kapunk. A hibakezelés try segítségével lehetővé teszi az érvénytelen JSON elkapását anélkül, hogy az alkalmazás összeomlana.
A JSONDecoder négy kulcsstratégiát támogat: useDefaultKeys (pontos egyezés), convertFromSnakeCase (snake_case → camelCase), custom (closure) és convertFromKebabCase (kebab-case → camelCase). Dátumokhoz a .iso8601, .secondsSince1970, .millisecondsSince1970 és egyéni dateFormatter áll rendelkezésre. A megfelelő stratégia kiválasztása az első lépés a stabil deszerializáció felé, ami megakadályozza a formátumeltérési hibák többségét.
JSONDecoder — a szabványos deszerializációs mechanizmus az iOS SDK-ban, amely a Codable protokollal működik. A JSONDecoder automatikusan elemzi a JSON-t struct vagy class példányokká, támogatva a beágyazott objektumokat, tömböket és primitív típusokat. Egyéni logikához az init(from: Decoder) metódust használjuk — ez lehetővé teszi a nem szabványos formátumok, az API régebbi verziójában hiányzó mezők kezelését vagy több JSON kulcs egyetlen tulajdonságba történő összevonását.
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 határozza meg, hogy a JSONDecoder hogyan értelmezi a dátumot tartalmazó sztringeket. Leggyakrabban a .iso8601-et használják — a REST API szabványos formátumát. A beágyazott OrderStatus enum automatikusan dekódolódik a JSON sztring értékekből. Ez elkerüli a varázsszámokat és öndokumentálóvá teszi a kódot — a rendelés állapota mindig szigoróan meghatározott értékkészlettel rendelkezik.
A Swift 4.2-től kezdve a Codable támogatja a property wrappereket az egyes tulajdonságok egyéni deszerializálásához. A @DefaultValue — népszerű wrapper, amely alapértelmezett értéket állít be, ha a mező hiányzik a JSON-ból. A @LosslessString sztringet számmá alakít és fordítva. Ez különösen hasznos, amikor a szerver az id-t sztringként „123” küldi, a modell pedig Int-et vár. A property wrapperek csökkentik a sablonkódot az init(from:)-ban és tisztábbá teszik a modelleket.
Androidon a deszerializációs könyvtár választása a projekt nyelvétől és követelményeitől függ. A Google Gson-ja — a legelterjedtebb opció, amely reflection segítségével működik, de bonyolult hierarchiákon teljesítményproblémákkal küzd. A Square Moshi-ja támogatja mind a reflection-t, mind a code generation-t, kevesebb memóriát fogyaszt és gyorsabban dolgozza fel a nagy válaszokat. A JetBrains kotlinx.serialization-ja — natív Kotlin megoldás a fordítóba integrálva, amely egyáltalán nem használ reflection-t.
@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 — Kotlin fordítói annotáció, amely aktiválja a kódgenerálást az osztály számára. Az ignoreUnknownKeys paraméter megakadályozza az összeomlást, ha a szerver olyan mezőt küldött, amely nem létezik a modellben. A snake_case kulcsok leképezéséhez a @SerialName-et használják — az iOS-ből ismert convertFromSnakeCase megfelelőjét. A JetBrains (2026) adatai szerint a könyvtár támogatja a többplatformos használatot: ugyanaz a Serializable osztály működik Androidon, iOS-en (KMP) és szerveroldali Kotlinban.
A könyvtárak közötti választás a sebesség és rugalmasság kompromisszumára vezethető vissza. A Gson jó prototípusokhoz és Java projektekhez — nem igényel annotációkat ‑s „dobozból” működik. A Moshi középső pozíciót foglal el: a @JsonClass(generateAdapter = true) útján történő codegen a kotlinx.serialization-hoz közeli sebességet biztosít, a reflection mód pedig a Gson rugalmasságát. A kotlinx.serialization — a leggyorsabb opció tiszta Kotlin projektekhez, de Kotlin 1.4+ és a Kotlin Serialization plugin szükséges hozzá a Gradle-ben.
| Könyvtár | Mechanizmus | Sebesség | KMP |
|---|---|---|---|
| Gson | Reflection | Alacsony | Nem |
| Moshi | Reflection / Codegen | Közepes / Magas | Nem |
| kotlinx.serialization | Compiler codegen | Magas | Igen |
Type mismatch — az a helyzet, amikor a JSON egyik típus értékét tartalmazza, és a modell másik típusra számít. A szerver a „42” sztringet küldte szám helyett, vagy az 1-es számot boolean true helyett. iOS-en a JSONDecoder alapértelmezés szerint DecodingError.typeMismatch hibát dob, Androidon a Gson megpróbálja átalakítani, a Moshi és a kotlinx.serialization pedig explicit adaptereket igényel. Megoldás — használjon lenient stratégiákat vagy egyéni deszerializálókat bizonyos mezőkhöz.
Amikor a szerver nem tartalmaz egy opcionális mezőt, a kód hibával összeomlik. Az Optional Swiftben és a nullable típusok Kotlinban megoldják a problémát: ha egy mező null vagy hiányzik a JSON-ból, a tulajdonság nil/null értéket kap, és az alkalmazás tovább működik. A kötelező mezők esetében érdemes ellenőrizni a meglétüket az API kliens szintjén a deszerializáció előtt. A Moshi és a kotlinx.serialization alapértelmezés szerint az összes mezőt megköveteli — a nullable jelölés és az alapértelmezett értékek eltávolítják ezt a korlátozást.
A JSON szerkezetének megváltoztatása a szerveren — gyakori forrása az éles üzemi összeomlásoknak. A szabványos gyakorlat a sémaverziózás a version mezőn keresztül a gyökérobjektumban és 2-3 előző verzió támogatása a kliens oldalon. A kotlinx.serialization lehetővé teszi több modell deklarálását különböző verziókhoz és a megfelelő kiválasztását a version mező alapján a JsonElement-be történő kezdeti elemzés után. További védelem — ignoreUnknownKeys az új mezőkhöz és alapértelmezett értékek azokhoz a mezőkhöz, amelyeket esetleg eltávolítanak.
| Hiba | Tünet | Védelemmel ellátott könyvtár |
|---|---|---|
| Type mismatch | DecodingError / kivétel | kotlinx — coerceInputValues = true |
| Hiányzó mező | Összeomlás hozzáféréskor | Moshi — @Transient + default |
| Helytelen dátumformátum | Dekódolási hiba | JSONDecoder — dateDecodingStrategy |
| További mezők | Figyelmen kívül hagyva vagy összeomlás | kotlinx — ignoreUnknownKeys = true |
| Null non-null mezőben | Összeomlás futási időben | Moshi — lenient @Nullable-lel |
Deszerializációs hibák naplózása — kötelező gyakorlat éles üzemben. Csomagolja a decode-ot do/catch-be, naplózza a nyers JSON-t és a várt modell típusát a Crashlytics-ben vagy a Sentry-ben. Ez lehetővé teszi annak gyors meghatározását, hogy melyik API melyik mezője és az alkalmazás melyik verziójában hibásodott meg. Naplózás nélkül a deszerializációs hiba rejtélyes összeomlásként jelenik meg kontextus nélkül.
Gyakran ismételt kérdések
Parszolás — a strukturált szöveg alkotóelemeire bontása kötelező tipizált modell létrehozása nélkül. A deszerializáció a parszolás speciális esete, amelynek eredménye egy teljes értékű nyelvi objektum ismert tulajdonságtípusokkal. A parszolás lehet folyamszerű, a deszerializáció mindig teljes objektumot hoz létre.
Tiszta Kotlin projekt esetén a kotlinx.serialization ajánlott — integrálva van a fordítóba, nem használ reflection-t és támogatja a Kotlin Multiplatformot. Meglévő Java projekthez — Moshi code generation-nel. A Gson-t jobb legacy projektekben megtartani, ahol a cseréje jelentős erőfeszítést igényelne.
iOS-en használja a keyDecodingStrategy = .convertFromSnakeCase beállítást a JSONDecoder-ben. Androidon a kotlinx.serialization-ban használja a @SerialName annotációt minden mezőhöz. A Moshiban alkalmazza a @Json(name=„field_name”) vagy egy globális JsonAdapter.Factory-t. Az egységes stílus projekt szinten — best practice, amelyet az API szerződésben rögzítenek.
A leggyakoribb ok a váratlan null a szervertől egy kötelezőként deklarált mező esetében. Fejlesztés közben a szerver teljes adatokat küld, éles üzemben — rövidített választ. Megoldás: jelölje meg az összes potenciálisan hiányzó mezőt nullable-ként (Kotlin) vagy optional-ként (Swift), használjon ignoreUnknownKeys és alapértelmezett értékeket.
A Code generation (Moshi codegen, kotlinx.serialization, Codable) 2-4-szer gyorsabban működik, mint a reflection a Google benchmarkjaiban. A sebességen túl a kódgenerálás típusbiztosabb, nem igényli az osztály metaadatait futási időben, és a típushibák a fordítási fázisban derülnek ki, nem a deszerializáció pillanatában.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is