Parsing — JSON, XML, CSV və ya Protobuf-dan tətbiqdə istifadə üçün məlumat çıxaran strukturlaşdırılmış məlumatların sintaktik analizi prosesidir. Square Engineering (2025) məlumatlarına görə, parsing strategiyasının seçimi birbaşa mobil tətbiqin performansına təsir edir. Axın parsingi bütün sənədi yaddaşa yükləmədən meqabayt məlumatları emal etməyə imkan verir.
Vacib
Parsing (sintaktik analiz) — simvol ardıcıllığının proqram emalı üçün yararlı strukturlaşdırılmış təmsilə çevrilməsi prosesidir. Mobil inkişaf kontekstinda parsing server cavablarının, konfiqurasiya fayllarının, lokal keşin və resurs fayllarının təhlilini əhatə edir. Hər format öz yanaşmasını tələb edir: JSON — yünül və SDK-ya daxil, XML — XSD sxem validasiyası ilə ciddi, CSV — cədvəl məlumatları üçün minimalist, Protobuf — sərt sxemli ikili format.
Hər bir parser, formatdan asılı olmayaraq, üç mərhələdən keçir. Leksik analiz xam mətni leksemlərə ayırır: açarlar, sətrlər, rəqəmlər, ayırıcılar və řərhlər. Sintaktik analiz qrammatikanın düzgünlüyünü yoxlayır — JSON-da mötərizə balansı, XML-də teqlərin düzgün yerləşməsi. Çıxış strukturunun qurulması obyekt təmsilini formalaşdırır: JSONObject, Map və ya sonrakı emal üçün token axını. Apple (2026) məlumatlarına görə, iOS-da daxili Foundation parseri tənbel analizdən istifadə edir — resurslara qənaət edərək yalnız JSON-un əvvəlini yoxlayır.
Əl ilə parsing (JSONSerialization, XmlPullParser) proses üzərində tam nəzarət verir və qeyri-standart formatlarda və ya hər sahənin fərdi validasiyası zürurətində faydalıdır. Avtomatik kitabxanalar (JSONDecoder, Moshi, kotlinx.serialization) inkişafı sürətləndirir, lakin səhv idarəetmə detallarını gizlədir. Seçim tələblərdən asılıdır: məlumat strukturu dinamik və ya əvvəlcədən məlum deyilsə — əl ilə parsing üstünlüklüdür. Sxem sabitdirsə — avtomatik deserializasiya kodu 60–70% qısaltır.
Parsing — daha geniş əməliyyat: axın şəklində yerinə yetirilə bilər və mütləq tipizasiya olunmuş obyekt yaratmır. Deserializasiya — parsingin xüsusi halıdır, nəticəsi həmişə əvvəlcədən məlum sinfin konkret xüsusiyyət növləri ilə nümunəsidir. JSON parseri sənədi Map və ya JsonElement-ə ayırır, deserializator isə eyni JSON-u məlum sahələri və növləri ilə konkret User, Order və ya Product obyektinə çevirir.
| Xarakteristika | Parsing | Deserializasiya |
|---|---|---|
| Nəticə | JsonElement, Map, token axını | Tipizasiya olunmuş obyekt (User, Order) |
| Axın rejimi | Bəli (SAX, JsonReader) | Xeyr (bütün obyekt yaddaşda) |
| Tipizasiya | İxtiyari, dinamik tiplər | Məcburi, statik tiplər |
| Nümunə | XmlPullParser.next(), SAX events | json.decodeFromString<User>() |
Axın parsingi — parsingin deserializasiya üzərində əsas üstünlüyüdür. Android-də XmlPullParser XML-i oxuduqca təhlil edir, bütün sənədi operativ yaddaşa yükləmədən. Bu, böyük API cavabları, yüzlərlə elementli RSS lentlərinin parsingi və ya server dump-indan minlərlə JSON obyektinin emalı üçün vacibdir. Axın parseri tokenbətoken oxuyur, sənədin ölçüsündən asılı olmayaraq sabit miqdarda yaddaş istehlak edir.
JSON — dominant məlumat mübadiləsi formatı. iOS-da daxili JSONSerialization JSON-u Any-yə, JSONDecoder isə birbaşa Codable strukturuna çevirir. Android-də standart org.json əl ilə analiz üçün JSONObject və JSONArray təmin edir. Gson və Moshi avtomatik çevirmə əlavə edir. Əl ilə və avtomatik yanaşma arasında seçim şəbəkə qatının ilk memarlıq qərarıdır.
val jsonString = """{"users":[{"id":1,"name":"Alice"}]}"""
val jsonObject = JSONObject(jsonString)
val usersArray = jsonObject.getJSONArray("users")
for (i in 0 until usersArray.length()) {
val item = usersArray.getJSONObject(i)
val id = item.getInt("id")
val name = item.getString("name")
// istifadəçi emalı
}
org.json vasitəsilə əl ilə parsing cavab strukturu əvvəlcədən məlum olmadıqda və ya çox dəyişən zaman faydalıdır. Bu yanaşma səhv idarəetməsi və nullable sahələr üzərində tam nəzarət verir, lakin avtomatik deserializasiya ilə müqayisədə daha çox şablon kodu tələb edir. Kiçik layihələr və ya prototiplər üçün məqbuldur, lakin production-da Moshi və ya kotlinx.serialization tövsiyə olunur.
JsonReader Moshi kitabxanasından — axın JSON parsingi üçün güclü alətdir. Sənədi tokenbətoken oxuyur, beginObject, nextName, nextString, nextInt və endObject metodlarından istifadə edir. Bu yanaşma sabit yaddaş istehlakı ilə istənilən ölçüdəki sənədləri emal etməyə imkan verir. Google (2026) məlumatlarına görə, JsonReader vasitəsilə axın parsingi bütün sənədi JsonObject-ə yükləməkdən 2–3 dəfə sürətli və 80% daha az yaddaş istehlak edir.
val reader = JsonReader(StringReader(json))
reader.beginObject()
while (reader.hasNext()) {
val name = reader.nextName()
when (name) {
"id" -> val id = reader.nextInt()
"name" -> val name = reader.nextString()
"email" -> val email = reader.nextString()
else -> reader.skipValue()
}
}
reader.endObject()
Nümunədə JSON-u axın şəklində təhlil edən JsonReader göstərilmişdir. Hər nextName() və nextInt() çağırışı kursoru növbəti tokenə irəlilədir. skipValue() lazımsız sahələri təhlil etmədən keçir — bu, JSON 50 sahə ehtiva etdikdə və yalnız 3-nün lazım olduğu zaman xüsusilə faydalıdır. Nəticə — minimal yaddaş istehlakı və maksimum sürət.
XML hələ də Android layihələrində resurslar və korporativ tətbiqlərin SOAP xidmətləri üçün istifadə olunur. Android-də daxili XmlPullParser minimal yaddaş istehlakı ilə axın analizi təmin edir — DOM ağacını yükləmir, START_TAG, TEXT, END_TAG hadisələri yaradır. iOS XMLParser-dən deleqat yanaşması ilə istifadə edir: parser(didStartElement:) və parser(foundCharacters:) metodları elementləri ardıcıl emal edir.
CSV — cədvəl məlumatlarının ixracı və idxalı üçün ən sadə format. Mobil tətbiqlərdə CSV hesabatların ixracı, arayış kitabçalarının yüklənməsi (ölkə, valyuta, kod siyahıları) və offlayn məlumatların sinxronizasiyası üçün istifadə olunur. CSV parsingi üçün axın kitabxanaları uyğundur: Apache Commons CSV və OpenCSV faylları sətrbəsətr emal edir, dəyərlər daxilindəki dırnaqları və vergülləri ekranlaşdırır. iOS-da CSV parsingi NSString.components(separatedBy:) delimiteri ilə kənar halların idarə edilməsi ilə həyata keçirilə bilər.
class CSVParser: NSObject, XMLParserDelegate {
private var currentItem: [String: String] = [:]
private var currentElement: String = ""
func parser(
_ parser: XMLParser,
didStartElement elementName: String,
namespaceURI: String?,
qualifiedName qName: String?,
attributes attributeDict: [String: String]
) {
currentElement = elementName
if elementName == "item" {
currentItem = [:]
}
}
func parser(_ parser: XMLParser,
foundCharacters string: String) {
currentItem[currentElement] = string
}
}
RSS lentinin təhlili üçün iOS-da XMLParser deleqatının nümunəsi. didStartElement metodu hər açılış teqində çağırılır, foundCharacters teqlər arasındakı mətn məzmununu qaytarır, didEndElement elementi bitirir. Belə hadisə arxitekturası DOM ağacını yaddaşa yükləmədən istənilən ölçüdəki XML-i emal etməyə imkan verir — mobil cihazların məhdud resursları üçün vacibdir.
Android-də CSV parserinin seçimi məlumatların həcmindən asılıdır. OpenCSV fluent API, POJO-ını xəritələndirmə üçün annotasiyalar və fərdi ayırıcılar dəstəkləyir. Apache Commons CSV — daha aşağı səviyyəli, lakin böyük fayllarda daha sürətli. Sadə hallarda (1–2 sütun) ekranlaşdırma ilə String.split(",") vasitəsilə əl ilə analiz kifayətdir. Böyük CSV faylları olan production layihələri üçün OpenCSV tövsiyə olunur.
Protocol Buffers Google-dan — JSON-u sürət və yığcamlıq baxımından üstün olan ikili serializasiya formatıdır. Protobuf mesajı ekvivalent JSON-dan 3–6 dəfə az yer tutur və ikili format və sərt sxem sayəsində 4–10 dəfə sürətli təhlil edilir. Əsas çatışmazlıqlar: insan tərəfindən oxunaqlılığın olmaması və protoc kompilyatoru vasitəsilə .proto fayllarından kod yaratma ehtiyacı.
Protobuf-un axın parsingi CodedInputStream vasitəsilə həyata keçirilir — müştəri bütün mesajı yükləmədən sahələri gəldikcə oxuyur. Hər sahənin bir teqi (nömrə + tip) var və parser məlum olmayan sahələri ötürə bilər. Google (2026) məlumatlarına görə, Protobuf-un axın analizi 1 MB-dan mesajları emal edərkən 90% daha az yaddaş istehlak edir — bu, məhdud RAM-lı mobil cihazlar üçün vacibdir. Protobuf-lite — Android üçün xüsusi versiya, yaradılan kodun ölçüsünə görə optimallaşdırılmışdır.
Tez-tez verilən suallar
JSONSerialization — tipizasiyasız Any (Dictionary, Array) qaytaran əl ilə parsingdir. JSONDecoder — Codable tiplərinə avtomatik deserializasiya. JSONSerialization dinamik strukturlar üçün elastiklik verir, JSONDecoder — məlum sxemlər üçün sürət və tip təhlükəsizliyi. Production-da JSONDecoder tövsiyə olunur.
Axın parsingi 500 KB-dan cavablarda, RSS/Atom lentlərinin parsingində və məhdud yaddaşlı cihazlarda faylların təhlilində məcburidir. 100 KB-dan tipik API cavabları üçün JSONDecoder və ya Moshi vasitəsilə avtomatik deserializasiya üstünlüklüdür — kod daha təmiz və daha sürətli hazırlanır.
Android SDK org.json (JSONObject, JSONArray), XmlPullParser (XML) və android.util.JsonReader daxildir. CSV, YAML və Protobuf üçün əlavə kitabxanalar tələb olunur: CSV üçün OpenCSV, YAML üçün SnakeYAML, Protobuf üçün protobuf-javalite.
kotlinx.serialization-da lenient rejimindən və ya Moshi-də JsonReader.setLenient(true) istifadə edin — artıq vergülləri, ekranlaşdırılmamış dırnaqları və təksətirli şərhləri bağışlayır. Tam validasiya üçün Pact və ya Spring Cloud Contract vasitəsilə kontrakt testini tətbiq edin.
SAX (Simple API for XML) — sənədi gəzərkən startElement, characters, endElement hadisələri yaradan axın XML parseridir. Android-də XmlPullParser və iOS-da XMLParser vasitəsilə həyata keçirilir. RSS oxuyucularında, offlayn məlumatların sinxronizasiyasında və SVG fayllarının emalında tətbiq olunur.
Nəticələr
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