Parsing — процес синтаксне анализе структурираних података, који извлачи информације из JSON, XML, CSV или Protobuf за употребу у апликацији. Према Square Engineering (2025), избор стратегије parsing-а директно утиче на перформансе мобилне апликације. Стриминг parsing омогућуће обраду мегабајтова података без учитавања целог документа у меморију.
Главно
Parsing (синтаксна анализа) — процес претварања низа знакова у структурирани приказ погодан за програмску обраду. У контексту мобилног развоја, под parsing-ом се подразумева анализа одговора сервера, конфигурационих датотека, локалног кеша и датотека ресурса. Сваки формат захтева сопствени приступ: JSON — лаган и уграђен у SDK, XML — строг са валидацијом XSD шеме, CSV — минималистички за табеларне податке, Protobuf — бинарни са чврстом шемом.
Сваки парсер, без обзира на формат, пролази кроз три фазе. Лексичка анализа разбија сирови текст на лексеме: кључеве, низове, бројеве, раздвајнике и коментаре. Синтаксна анализа проверава исправност граматике — баланс заграда у JSON-у, исправност угњежђивања тагова у XML-у. Изградња излазне структуре формира објектни приказ: JSONObject, Map или токен стрим за даљу обраду. Према Apple (2026), уграђени Foundation парсер на iOS-у користи лењиву анализу — валидира само почетак JSON-а, штедећи ресурсе.
Ручни parsing (JSONSerialization, XmlPullParser) пружа потпуну контролу над процесом и користан је за нестандардне формате или потребу за прилагођеном валидацијом сваког поља. Аутоматске библиотеке (JSONDecoder, Moshi, kotlinx.serialization) убрзавају развој, али скривају детаље обраде грешака. Избор зависи од захтева: ако је структура података динамична или непозната унапред — ручни parsing је пожељнији. Ако је шема фиксна — аутоматска десеријализација скраћује код за 60–70%.
Parsing — шира операција: може се извршавати стримовски и не мора да креира типизовани објекат. Десеријализација — посебан случај parsing-а, чији је резултат увек инстанца унапред познате класе са конкретним типовима својстава. JSON парсер ће рашчланити документ на Map или JsonElement, а десеријализатор ће претворити исти JSON у конкретан објекат User, Order или Product са познатим пољима и њиховим типовима.
| Карактеристика | Parsing | Десеријализација |
|---|---|---|
| Резултат | JsonElement, Map, токен стрим | Типизовани објекат (User, Order) |
| Стрим начин | Да (SAX, JsonReader) | Не (цео објекат у меморији) |
| Типизација | Опционална, динамички типови | Обавезна, статички типови |
| Примјер | XmlPullParser.next(), SAX events | json.decodeFromString<User>() |
Стриминг parsing — главна предност parsing-а над десеријализацијом. XmlPullParser на Android-у рашчлањује XML док га чита, не учитавајући цео докуменат у радну меморију. Ово је критично за велике API одговоре, парсирање RSS федова са стотинама елемената или обраду низа хиљада JSON објеката из серверског дампа. Стрим парсер чита токен по токен, трошећи константну количину меморије без обзира на величину документа.
JSON — доминантни формат размене података. На iOS-у, уграђени JSONSerialization рашчлањује JSON у Any, а JSONDecoder — директно у Codable структуру. На Android-у, стандардни org.json пружа JSONObject и JSONArray за ручну анализу. Gson и Moshi додају аутоматску конверзију. Избор између ручног и аутоматског приступа — прва архитектурна одлука мрежног слоја.
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")
// обрада корисника
}
Ручни parsing кроз org.json је користан када је структура одговора непозната унапред или се значајно разликује. Овакав приступ пружа потпуну контролу над обрадом грешака и nullable пољима, али захтева више шаблонског кода у поређењу са аутоматском десеријализацијом. За мале пројекте или прототипове је прихватљиво, али у продукцији се препоручује Moshi или kotlinx.serialization.
JsonReader из Moshi библиотеке — моћан алат за стриминг parsing JSON-а. Чита докуменат токен по токен, користећи методе beginObject, nextName, nextString, nextInt и endObject. Овакав приступ омогућуће обраду докумената било које величине са константним трошком меморије. Према Google (2026), стриминг parsing кроз JsonReader је 2–3 пута бржи од учитавања целог документа у JsonObject и троши до 80% мање меморије.
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()
У примјеру је приказан JsonReader који рашчлањује JSON стримовски. Сваки позив nextName() и nextInt() помиче курзор на следећи токен. skipValue() прескаче непотребна поља без њиховог рашчлањивања — ово је посебно корисно када JSON садржи 50 поља, а потребно је само 3. Резултат — минимална потрошња меморије и максимална брзина.
XML се и даље користи у Android пројектима за ресурсе и у SOAP сервисима корпоративних апликација. На Android-у, уграђени XmlPullParser омогућуће стрим анализу са минималним трошком меморије — не учитава DOM дрво, већ генерише догађаје START_TAG, TEXT, END_TAG. iOS користи XMLParser са делегатским приступом: методе parser(didStartElement:) и parser(foundCharacters:) обрађују елементе секвенцијално.
CSV — најједноставнији формат за извоз и увоз табеларних података. У мобилним апликацијама, CSV се користи за извоз извештаја, учитавање речника (спискови земаља, валута, кодова) и синхронизацију офлајн података. За parsing CSV-а погодне су стрим библиотеке: Apache Commons CSV и OpenCSV обрађују датотеке ред по ред, екранујући наводнике и запете унутар вредности. На iOS-у, CSV parsing се може реализовати кроз делимитер NSString.components(separatedBy:) са обрадом изузетних случајева.
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
}
}
Примјер XMLParser делегата на iOS-у за рашчлањивање RSS феда. Метода didStartElement се позива на сваком отварајућем тагу, foundCharacters враћа текстуални садржај између тагова, didEndElement завршава елемент. Оваква догађајна архитектура омогућуће обраду XML-а било које величине без учитавања DOM дрвета у меморију — критично за ограничене ресурсе мобилних уређаја.
На Android-у, избор CSV парсера зависи од обима података. OpenCSV подржава fluent API, анотације за мапирање на POJO и прилагођене раздвајнике. Apache Commons CSV — нижег нивоа, али бржи на великим датотекама. За једноставне случајеве (1–2 колоне) довољна је ручна анализа кроз String.split(",") са обрадом екрановања. За продукцијске пројекте са великим CSV датотекама, препоручује се OpenCSV.
Protocol Buffers од Google-а — бинарни формат серијализације, надмашъујући JSON по брзини и компактности. Protobuf порука заузима 3–6 пута мање простора од еквивалентног JSON-а и рашчлањује се 4–10 пута брже захваљујући бинарном формату и чврстој шеми. Главни недостаци: недостатак људске читљивости и потреба за генерисањем кода из .proto датотека кроз protoc компилер.
Стриминг parsing Protobuf-а се реализује кроз CodedInputStream — клијент чита поља како стижу без учитавања целе поруке. Свако поље има таг (број + тип), и парсер може да прескочи непозната поља. Према Google (2026), стриминг анализа Protobuf-а троши до 90% мање меморије при обради порука од 1 MB, што је критично за мобилне уређаје са ограниченом RAM-ом. Protobuf-lite — посебна верзија за Android, оптимизована по величини генерисаног кода.
Често постављана питања
JSONSerialization — ручни parsing који враћа Any (Dictionary, Array) без типизације. JSONDecoder — аутоматска десеријализација у Codable типове. JSONSerialization пружа флексибилност за динамичке структуре, JSONDecoder — брзину и типску безбедност за познате шеме. У продукцији се препоручује JSONDecoder.
Стриминг parsing је обавезан за одговоре од 500 KB, парсирање RSS/Atom федова и анализу датотека на уређајима са ограниченом меморијом. За типичне API одговоре до 100 KB, аутоматска десеријализација кроз JSONDecoder или Moshi је пожељнија — код је чишћи и брже се развија.
Android SDK укључује org.json (JSONObject, JSONArray), XmlPullParser (XML) и android.util.JsonReader. За CSV, YAML и Protobuf потребне су додатне библиотеке: OpenCSV за CSV, SnakeYAML за YAML, protobuf-javalite за Protobuf.
Користите lenient начин у kotlinx.serialization или JsonReader.setLenient(true) у Moshi-ју — прашта вишкове запете, неекраниране наводнике и једноредне коментаре. За потпуну валидацију, вдружите уговорно тестирање кроз Pact или Spring Cloud Contract.
SAX (Simple API for XML) — стрим XML парсер који генерише догађаје startElement, characters, endElement приликом обиласка документа. Реализован кроз XmlPullParser на Android-у и XMLParser на iOS-у. Примењује се у RSS читачима, синхронизацији офлајн података и обради SVG датотека.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође