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 (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.
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 (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 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.
| Özellik | Ayrıştırma | Serileştirme |
|---|---|---|
| Sonuç | JsonElement, Map, token akışı | Türü belirtilmiş nesne (User, Order) |
| Akış modu | Evet (SAX, JsonReader) | Hayır (nesnenin tamamı bellekte) |
| Tipleme | İsteğe bağlı, dinamik türler | Zorunlu, statik türler |
| Örnek | XmlPullParser.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.
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.
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.
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.
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, 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.
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.
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'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.
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, 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.
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 ş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.
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 (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
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.
Ayrıca okuyun