Mobil Uygulamalarda Ayrıştırma: Özü, Veri Biçimleri ve Süreci

Yazar: IT Sectr Yayınlanma: 2026-03-08 Okuma süresi: 8 dk

Ayrıştırma, yapılandırılmış verilerin sözdizimsel analizi sürecidir ve JSON, XML, CSV veya Protobuf'dan bilgi çıkararak uygulamada kullanılmasını sağlar. Square Engineering (2025)'e göre, ayrıştırma stratejisi seçimi doğrudan mobil uygulama performansını etkiler. Akış ayrıştırma, tüm belgeyi belleğe yüklemeden megabaytlarca verinin işlenmesine olanak tanır.

Önemli Noktalar

  • Ayrıştırma — zorunlu tipleme olmadan veri çıkarmak için yapılandırılmış metni token'lara ayırma.
  • JSON — iOS ve Android mobil uygulamalarında REST API'leri için en popüler biçim.
  • Akış ayrıştırma büyük dosyaları ve RSS akışlarını işlerken bellekten tasarruf sağlar.
  • Kod oluşturma — derleme zamanında ayrıştırıcı oluşturarak çalışma zamanını 2-4 kat hızlandırır.
  • Protobuf — JSON'dan 3-6 kat daha kompakt ve ayrıştırması daha hızlı olan ikili biçim.

Ayrıştırma Nedir?

Ayrıştırma (sözdizimsel analiz), bir karakter dizisini programatik işleme uygun yapılandırılmış bir temsile dönüştürme sürecidir. Mobil geliştirme bağlamında, ayrıştırma sunucu yanıtlarının, yapılandırma dosyalarının, yerel önbelleğin ve kaynak dosyalarının işlenmesini ifade eder. Her biçim kendi yaklaşımını gerektirir: JSON — hafif ve SDK'ya entegre, XML — XSD şema doğrulamasıyla katı, CSV — tablo verileri için minimalist, Protobuf — katı şemalı ikili biçim.

Sözdizimsel Analizin Aşamaları

Her ayrıştırıcı, biçimden bağımsız olarak üç aşamadan geçer. Sözcüksel analiz ham metni token'lara ayırır: anahtarlar, dizeler, sayılar, ayırıcılar ve yorumlar. Sözdizimsel analiz dilbilgisi doğruluğunu kontrol eder — JSON'da parantez dengesi, XML'de etiket iç içe geçmesinin doğruluğu. Çıktı yapısı oluşturma bir nesne temsili oluşturur: JSONObject, Map veya daha sonraki işleme için token akışı. Apple (2026)'ye göre, iOS'taki yerleşik Foundation ayrıştırıcısı tembel ayrıştırma kullanır — yalnızca JSON'un başlangıcını doğrulayarak kaynak tasarrufu sağlar.

Manuel Ayrıştırma vs Otomatik Kütüphaneler

Manuel ayrıştırma (JSONSerialization, XmlPullParser) süreç üzerinde tam kontrol sağlar ve standart olmayan biçimler veya her alanın özel doğrulaması gerektiğinde kullanışlıdır. Otomatik kütüphaneler (JSONDecoder, Moshi, kotlinx.serialization) geliştirmeyi hızlandırır ancak hata işleme ayrıntılarını gizler. Seçim gereksinimlere bağlıdır: veri yapısı dinamik veya önceden bilinmiyorsa — manuel ayrıştırma tercih edilir. Şema sabitse — otomatik serileştirme kodu %60-70 oranında azaltır.

Ayrıştırma Serileştirmeden Nasıl Farklıdır

Ayrıştırma daha geniş bir işlemdir: akış modunda yapılabilir ve mutlaka türü belirtilmiş bir nesne oluşturmaz. Serileştirme, sonucu her zaman belirli özellik türlerine sahip bilinen bir sınıfın örneği olan ayrıştırmanın belirli bir durumudur. Bir JSON ayrıştırıcısı belgeyi Map veya JsonElement'e ayırırken, bir serileştirici aynı JSON'u bilinen alanları ve türleriyle User, Order veya Product nesnesine dönüştürür.

ÖzellikAyrıştırmaSerileştirme
SonuçJsonElement, Map, token akışıTürü belirtilmiş nesne (User, Order)
Akış moduEvet (SAX, JsonReader)Hayır (nesnenin tamamı bellekte)
Tiplemeİsteğe bağlı, dinamik türlerZorunlu, statik türler
ÖrnekXmlPullParser.next(), SAX olaylarıjson.decodeFromString<User>()

Akış ayrıştırma, ayrıştırmanın serileştirmeye göre ana avantajıdır. Android'de XmlPullParser, tüm belgeyi RAM'e yüklemeden okurken XML'i ayrıştırır. Bu, büyük API yanıtları, yüzlerce öğe içeren RSS akışlarını ayrıştırma veya sunucu dökümünden binlerce JSON nesnesinden oluşan dizileri işleme için kritiktir. Bir akış ayrıştırıcısı, belge boyutundan bağımsız olarak sabit miktarda bellek tüketerek token token okur.

Mobil Uygulamalarda JSON Ayrıştırma

JSON baskın veri değişim biçimidir. iOS'ta yerleşik JSONSerialization JSON'u Any'ye ayrıştırırken, JSONDecoder doğrudan Codable yapısına ayrıştırır. Android'de standart org.json, manuel ayrıştırma için JSONObject ve JSONArray sağlar. Gson ve Moshi otomatik dönüştürme ekler. Manuel ve otomatik yaklaşımlar arasında seçim yapmak, ağ katmanının ilk mimari kararıdır.

kotlin
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")
    // kullanıcı işleme
}

org.json ile manuel ayrıştırma, yanıt yapısı önceden bilinmediğinde veya büyük ölçüde değiştiğinde kullanışlıdır. Bu yaklaşım, hata işleme ve boş değer alabilen alanlar üzerinde tam kontrol sağlar ancak otomatik serileştirmeye kıyasla daha fazla kalıp kodu gerektirir. Küçük projeler veya prototipler için kabul edilebilir, ancak üretimde Moshi veya kotlinx.serialization tercih edilir.

Akış Ayrıştırma için JsonReader

Moshi kütüphanesinden JsonReader, akış JSON ayrıştırma için güçlü bir araçtır. beginObject, nextName, nextString, nextInt ve endObject gibi yöntemleri kullanarak belgeyi token token okur. Bu yaklaşım, sabit bellek tüketimiyle her boyuttaki belgenin işlenmesine olanak tanır. Google (2026)'ya göre, JsonReader ile akış ayrıştırma, tüm belgeyi bir JsonObject'e yüklemekten 2-3 kat daha hızlıdır ve %80'e kadar daha az bellek tüketir.

kotlin
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()

Örnek, JsonReader'ın JSON'u akış modunda ayrıştırdığını gösterir. nextName() ve nextInt() çağrılarının her biri imleci bir sonraki token'a taşır. skipValue(), ayrıştırmadan gereksiz alanları atlar — özellikle JSON 50 alan içerdiğinde ancak yalnızca 3'üne ihtiyaç duyulduğunda kullanışlıdır. Sonuç, minimum bellek tüketimi ve maksimum hızdır.

XML ve CSV Ayrıştırma

XML, Android projelerinde kaynaklar ve kurumsal uygulamaların SOAP hizmetlerinde kullanılmaya devam etmektedir. Android'de yerleşik XmlPullParser, minimum bellek tüketimiyle akış ayrıştırma sağlar — bir DOM ağacı yüklemez, START_TAG, TEXT, END_TAG olayları oluşturur. iOS, bir temsilci yaklaşımıyla XMLParser kullanır: parser(didStartElement:) ve parser(foundCharacters:) yöntemleri öğeleri sırayla işler.

Mobil Geliştirmede CSV

CSV, tablo verilerini dışa ve içe aktarmak için en basit biçimdir. Mobil uygulamalarda CSV, rapor dışa aktarma, referans verileri (ülke listeleri, para birimleri, kodlar) yükleme ve çevrimdışı veri senkronizasyonu için kullanılır. Akış kütüphaneleri CSV ayrıştırma için uygundur: Apache Commons CSV ve OpenCSV, değerler içindeki tırnak işaretlerini ve virgülleri kaçış karakterleriyle işleyerek dosyaları satır satır işler. iOS'ta CSV ayrıştırma, uç durumları ele alarak NSString.components(separatedBy:) ayırıcı yöntemiyle uygulanabilir.

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

Bir RSS akışını ayrıştırmak için iOS'ta bir XMLParser temsilcisi örneği. didStartElement yöntemi her açılış etiketinde çağrılır, foundCharacters etiketler arasındaki metin içeriğini döndürür, didEndElement öğeyi tamamlar. Bu olay tabanlı mimari, bir DOM ağacını belleğe yüklemeden her boyuttaki XML'in işlenmesine olanak tanır — mobil cihazların sınırlı kaynakları için kritiktir.

Android için CSV Kütüphanelerinin Karşılaştırması

Android'de CSV ayrıştırıcı seçimi veri hacmine bağlıdır. OpenCSV akıcı bir API, POJO eşleme için ek açıklamalar ve özel ayırıcılar destekler. Apache Commons CSV daha düşük seviyelidir ancak büyük dosyalarda daha hızlıdır. Basit durumlar (1-2 sütun) için, kaçış işleme ile String.split(",") ile manuel ayrıştırma yeterlidir. Büyük CSV dosyaları olan üretim projeleri için OpenCSV önerilir.

Protobuf ve Akış Ayrıştırma

Google'ın Protocol Buffers'ı, hız ve kompaktlık açısından JSON'u geride bırakan ikili bir serileştirme biçimidir. Bir Protobuf mesajı, eşdeğer JSON'dan 3-6 kat daha az yer kaplar ve ikili biçimi ve katı şeması sayesinde 4-10 kat daha hızlı ayrıştırılır. Ana dezavantajları, insan tarafından okunabilirliğin olmaması ve protoc derleyicisi aracılığıyla .proto dosyalarından kod oluşturma gerekliliğidir.

Protobuf akış ayrıştırma, CodedInputStream aracılığıyla uygulanır — istemci, tüm mesajı yüklemeden alanları geldikçe okur. Her alanın bir etiketi (sayı + tür) vardır ve ayrıştırıcı bilinmeyen alanları atlayabilir. Google (2026)'ya göre, akış Protobuf ayrıştırma, 1 MB'tan itibaren mesajları işlerken %90'a kadar daha az bellek tüketir; bu, sınırlı RAM'e sahip mobil cihazlar için kritiktir. Protobuf-lite, oluşturulan kod boyutu için optimize edilmiş Android'e özel bir sürümdür.

Sıkça Sorulan Sorular

JSONSerialization ve JSONDecoder arasındaki fark nedir?

JSONSerialization, tipleme olmadan Any (Dictionary, Array) döndüren manuel ayrıştırmadır. JSONDecoder, Codable türlerine otomatik serileştirmedir. JSONSerialization dinamik yapılar için esneklik sağlarken, JSONDecoder bilinen şemalar için hız ve tür güvenliği sağlar. Üretimde JSONDecoder önerilir.

Tüm belgeyi yüklemek yerine ne zaman akış ayrıştırma kullanmalıyım?

Akış ayrıştırma, 500 KB'ın üzerindeki yanıtlar, RSS/Atom akışlarını ayrıştırma ve sınırlı belleğe sahip cihazlarda dosyaları işleme için zorunludur. 100 KB'a kadar olan tipik API yanıtları için JSONDecoder veya Moshi ile otomatik serileştirme tercih edilir — daha temiz kod ve daha hızlı geliştirme.

Android SDK'da varsayılan olarak hangi veri biçimleri desteklenir?

Android SDK şunları içerir: org.json (JSONObject, JSONArray), XmlPullParser (XML) ve android.util.JsonReader. CSV, YAML ve Protobuf ek kütüphaneler gerektirir: CSV için OpenCSV, YAML için SnakeYAML, Protobuf için protobuf-javalite.

Sunucudan hatalı JSON alındığında ne yapılmalı?

kotlinx.serialization'da lenient modu veya Moshi'de JsonReader.setLenient(true) kullanın — sondaki virgülleri, kaçış işareti konmamış tırnakları ve tek satırlık yorumları affeder. Tam doğrulama için Pact veya Spring Cloud Contract ile sözleşme testi uygulayın.

SAX ayrıştırma nedir ve nerede kullanılır?

SAX (Simple API for XML), belgeyi gezerken startElement, characters, endElement olayları oluşturan bir akış XML ayrıştırıcısıdır. Android'de XmlPullParser ve iOS'ta XMLParser aracılığıyla uygulanır. RSS okuyucularda, çevrimdışı veri senkronizasyonunda ve SVG dosya işlemede kullanılır.

Özet

  • Ayrıştırma — yapılandırılmış verileri işlemek için temel bir işlem, serileştirmeden daha kapsamlı: akış olabilir ve tipleme gerektirmez.
  • JSON — mobil geliştirmede REST API'leri için birincil biçim; JSONSerialization (iOS) ve org.json (Android) tarafından desteklenir.
  • Akış ayrıştırma (JsonReader, XmlPullParser, SAX) bellekten tasarruf sağlar ve büyük belgeler için kritiktir.
  • Protobuf — en hızlı ve en kompakt biçim, yüksek yük ve çapraz platform sistemleri için önerilir.
  • Android'de XmlPullParser ve iOS'ta XMLParser — olay tabanlı modelle standart akış XML ayrıştırma araçları.
  • CSV ayrıştırıcıları (OpenCSV, Apache Commons CSV) rapor dışa aktarma ve referans verisi yükleme için kullanışlıdır.
  • Manuel ve otomatik ayrıştırma arasındaki seçim, veri boyutuna, şema değişkenliğine ve cihaz bellek gereksinimlerine bağlıdır.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun