Parsing — proces syntaktické analýzy strukturovaných dat, který extrahuje informace z JSON, XML, CSV nebo Protobuf pro použití v aplikaci. Podle Square Engineering (2025), výběr strategie parsingu přímo ovlivňuje výkon mobilní aplikace. Streamovací parsing umožňuje zpracovávat megabajty dat bez nahrávání celého dokumentu do paměti.
Hlavní
Parsing (syntaktická analýza) — proces převodu sekvence znaků do strukturované reprezentace vhodné pro programové zpracování. V kontextu mobilního vývoje se parsingem rozumí analýza odpovědí serveru, konfiguračních souborů, lokální cache a souborů zdrojů. Každý formát vyžaduje vlastní přístup: JSON — lehký a integrovaný v SDK, XML — přísný s validací schématu XSD, CSV — minimalistický pro tabulková data, Protobuf — binární s pevným schématem.
Každý parser, bez ohledu na formát, prochází třemi fázemi. Lexikální analýza rozděluje surový text na lexémy: klíče, řetězce, čísla, oddělovače a komentáře. Syntaktická analýza kontroluje správnost gramatiky — vyváženost závorek v JSON, správnost vnoření tagů v XML. Budování výstupní struktury vytváří objektovou reprezentaci: JSONObject, Map nebo tok tokenů pro další zpracování. Podle Apple (2026), vestavěný parser Foundation na iOS používá línou analýzu — validuje pouze začátek JSON, šetří zdroje.
Ruční parsing (JSONSerialization, XmlPullParser) dává úplnou kontrolu nad procesem a je užitečný při nestandardních formátech nebo potřebě vlastní validace každého pole. Automatické knihovny (JSONDecoder, Moshi, kotlinx.serialization) urychlují vývoj, ale skrývají detaily zpracování chyb. Výběr závisí na požadavcích: pokud je struktura dat dynamická nebo předem neznámá — ruční parsing je preferovaný. Pokud je schéma fixní — automatická deserializace zkracuje kód o 60–70%.
Parsing — širší operace: může být proveden streamově a nemusí nutně vytvářet typizovaný objekt. Deserializace — speciální případ parsingu, jehož výsledkem je vždy instance předem známé třídy s konkrétními typy vlastností. JSON parser rozebere dokument na Map nebo JsonElement, zatímco deserializátor přemění stejný JSON na konkrétní objekt User, Order nebo Product se známými poli a jejich typy.
| Vlastnost | Parsing | Deserializace |
|---|---|---|
| Výsledek | JsonElement, Map, tok tokenů | Typizovaný objekt (User, Order) |
| Streamovací režim | Ano (SAX, JsonReader) | Ne (celý objekt v paměti) |
| Typizace | Volitelná, dynamické typy | Povinná, statické typy |
| Příklad | XmlPullParser.next(), SAX events | json.decodeFromString<User>() |
Streamovací parsing — hlavní výhoda parsingu nad deserializací. XmlPullParser na Androidu analyzuje XML během čtení, aniž by načítal celý dokument do operační paměti. To je kritické pro velké odpovědi API, parsing RSS kanálů se stovkami prvků nebo zpracování pole tisíců JSON objektů z výpisu serveru. Streamovací parser čte token po tokenu, spotřebovává konstantní množství paměti bez ohledu na velikost dokumentu.
JSON — dominantní formát výměny dat. Na iOS vestavěný JSONSerialization analyzuje JSON do Any, a JSONDecoder — přímo do struktury Codable. Na Androidu standardní org.json poskytuje JSONObject a JSONArray pro ruční analýzu. Gson a Moshi přidávají automatickou konverzi. Výběr mezi ručním a automatickým přístupem — první architektonické rozhodnutí síťové vrstvy.
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")
// zpracování uživatele
}
Ruční parsing pomocí org.json je užitečný, když struktura odpovědi je předem neznámá nebo se výrazně mění. Tento přístup dává úplnou kontrolu nad zpracováním chyb a nullable poli, ale vyžaduje více šablonského kódu ve srovnání s automatickou deserializací. Pro malé projekty nebo prototypy je to přijatelné, ale v produkci se doporučuje Moshi nebo kotlinx.serialization.
JsonReader z knihovny Moshi — výkonný nástroj pro streamovací parsing JSON. Čte dokument token po tokenu pomocí metod beginObject, nextName, nextString, nextInt a endObject. Tento přístup umožňuje zpracovávat dokumenty libovolné velikosti s konstantní spotřebou paměti. Podle Google (2026), streamovací parsing přes JsonReader je 2–3krát rychlejší než načítání celého dokumentu do JsonObject a spotřebovává až o 80% méně paměti.
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()
Příklad ukazuje JsonReader, který analyzuje JSON streamově. Každé volání nextName() a nextInt() posouvá kurzor na další token. skipValue() přeskakuje nepotřebná pole bez jejich analýzy — to je užitečné zejména když JSON obsahuje 50 polí a potřebná jsou jen 3. Výsledek — minimální spotřeba paměti a maximální rychlost.
XML se stále používá v Android projektech pro zdroje a v SOAP službách podnikových aplikací. Na Androidu vestavěný XmlPullParser poskytuje streamovou analýzu s minimální spotřebou paměti — nenačítá DOM strom, ale generuje události START_TAG, TEXT, END_TAG. iOS používá XMLParser s delegátním přístupem: metody parser(didStartElement:) a parser(foundCharacters:) zpracovávají prvky sekvenčně.
CSV — nejjednodušší formát pro export a import tabulkových dat. V mobilních aplikacích se CSV používá pro export zpráv, načítání česníků (seznamy zemí, měn, kódů) a synchronizaci offline dat. Pro parsing CSV jsou vhodné streamové knihovny: Apache Commons CSV a OpenCSV zpracovávají soubory řádek po řádku, escapují uvozovky a čárky uvnitř hodnot. Na iOS lze CSV parsing realizovat přes delimiter NSString.components(separatedBy:) s ošetřením okrajových případů.
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
}
}
Příklad delegáta XMLParser na iOS pro analýzu RSS kanálu. Metoda didStartElement se volá při každém otevíracím tagu, foundCharacters vrací textový obsah mezi tagy, didEndElement ukončuje prvek. Takováto událostní architektura umožňuje zpracovávat XML libovolné velikosti bez načítání DOM stromu do paměti — kritické pro omezené zdroje mobilních zařízení.
Na Androidu závisí výběr CSV parseru na objemu dat. OpenCSV podporuje fluent API, anotace pro mapování na POJO a vlastní oddělovače. Apache Commons CSV — nízkoúrovňovější, ale rychlejší na velkých souborech. Pro jednoduché případy (1–2 sloupce) stačí ruční analýza přes String.split(",") s ošetřením escapování. Pro produkční projekty s velkými CSV soubory se doporučuje OpenCSV.
Protocol Buffers od Google — binární formát serializace, překonávající JSON rychlostí a kompaktností. Protobuf zpráva zabírá 3–6krát méně místa než ekvivalentní JSON a je parsována 4–10krát rychleji díky binárnímu formátu a pevnému schématu. Hlavní nevýhody: nedostatek čitelnosti pro člověka a nutnost generování kódu z .proto souborů přes protoc kompilátor.
Streamovací parsing Protobuf se realizuje přes CodedInputStream — klient čte pole při jejich příchodu bez načítání celé zprávy. Každé pole má tag (číslo + typ) a parser může přeskakovat neznámá pole. Podle Google (2026), streamová analýza Protobuf spotřebovává až o 90% méně paměti při zpracování zpráv od 1 MB, což je kritické pro mobilní zařízení s omezenou RAM. Protobuf-lite — speciální verze pro Android, optimalizovaná na velikost generovaného kódu.
Často kladené otázky
JSONSerialization — ruční parsing, který vrací Any (Dictionary, Array) bez typizace. JSONDecoder — automatická deserializace do Codable typů. JSONSerialization dává flexibilitu pro dynamické struktury, JSONDecoder — rychlost a typovou bezpečnost pro známá schémata. V produkci se doporučuje JSONDecoder.
Streamovací parsing je povinný při odpovědích od 500 KB, při parsování RSS/Atom kanálů a při analýze souborů na zařízeních s omezenou pamětí. Pro běžné API odpovědi do 100 KB je automatická deserializace přes JSONDecoder nebo Moshi preferovaná — kód je čistší a rychleji se vyvíjí.
Android SDK obsahuje org.json (JSONObject, JSONArray), XmlPullParser (XML) a android.util.JsonReader. Pro CSV, YAML a Protobuf jsou vyžadovány další knihovny: OpenCSV pro CSV, SnakeYAML pro YAML, protobuf-javalite pro Protobuf.
Použijte lenient režim v kotlinx.serialization nebo JsonReader.setLenient(true) v Moshi — odpouští nadbytečné čárky, neescapované uvozovky a jednořádkové komentáře. Pro úplnou validaci zaveďte kontraktní testování přes Pact nebo Spring Cloud Contract.
SAX (Simple API for XML) — streamovací XML parser, který generuje události startElement, characters, endElement při procházení dokumentu. Implementován přes XmlPullParser na Androidu a XMLParser na iOS. Používá se v RSS čtečkách, synchronizaci offline dat a zpracování SVG souborů.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také