پارسینگ — فرآیند تجزیه و تحلیل سنتاکتیکی دادههای ساختاریافته است که اطلاعات را از JSON، XML، CSV یا Protobuf برای استفاده در برنامه استخراج میکند. به گزارش Square Engineering (2025)، انتخاب راهبرد پارسینگ مستقیماً بر عملکرد برنامه موبایل تأثیر میگذارد. پارسینگ جریانی به شما امکان پردازش مگابایتها داده را بدون بارگذاری کل سند در حافظه میدهد.
نکات کلیدی
پارسینگ (تجزیه و تحلیل سنتاکتیکی) — فرآیند تبدیل تسلسل نشانهها به یک نمایش ساختاریافته قابل استفاده برای پردازش برنامهای. در زمینه توسعه موبایل، پارسینگ به معنای تجزیه و تحلیل پاسخهای سرور، فایلهای پیکربندی، کش محلی و فایلهای منابع است. هر فرمت رویکرد خاص خود را نیاز دارد: JSON — سبک و ساخته در SDK، XML — سنگین با اعتبارسنجی شماته XSD، CSV — مینیمالیستی برای دادههای جدولی، Protobuf — دودوی با شماته سختگیر.
هر پارسر، به طور مستقل از فرمت، از سه مرحله گذر میکند. تجزیه لغوی متن خام را به لکسمها تقسیم میکند: کلیدها، رشتهها، اعداد، جداکنندهها و توضیحات. تجزیه سنتاکتیکی صحت دستور زبان را بررسی میکند — تعادل پرانتز در JSON، صحت تودره تگها در XML. ساخت ساختار خروجی نمایش شیئگرا را شکل میدهد: JSONObject، Map یا جریان توکن برای پردازش بیشتر. به گزارش Apple (2026)، پارسر ساختهشده Foundation در iOS از تجزیه تنبل استفاده میکند — تنها ابتدای JSON را اعتبارسنجی میکند و در منابع صرفهجویی میکند.
پارسینگ دستی (JSONSerialization, XmlPullParser) کنترل کامل بر فرآیند میدهد و در فرمتهای غیراستاندارد یا زمانی که اعتبارسنجی سفارشی هر فیلد نیاز است مفید است. کتابخانههای خودکار (JSONDecoder, Moshi, kotlinx.serialization) توسعه را سریع میکنند، اما جزئیات رسیدگی به خطا را پنهان میکنند. انتخاب به نیازها بستگی دارد: اگر ساختار داده پویا یا از قبل ناشناخته است — پارسینگ دستی ترجیح دارد. اگر شماته ثابت است — دسریالیساسیون خودکار کد را 60–70% کاهش میدهد.
پارسینگ — عملیات وسیعتر: میتواند به صورت جریانی انجام شود و لزوماً شیئی تایپبندی شده ایجاد نمیکند. دسریالیساسیون — حالت خاصی از پارسینگ است که نتیجه آن همیشه یک نمونه از کلاسی از پیش مشخوص با انواع مشخص ویژگیها است. پارسر JSON سند را به Map یا JsonElement تجزیه میکند، دسریالیساسیون همان JSON را به شیئی مشخص User، Order یا Product با فیلدهای مشخص و انواع آنها تبدیل میکند.
| ویژگی | پارسینگ | دسریالیساسیون |
|---|---|---|
| نتیجه | JsonElement, Map, جریان توکن | شیئ تایپبندی شده (User, Order) |
| حالت جریانی | بله (SAX, JsonReader) | خیر (کل شیئ در حافظه) |
| تایپبندی | اختیاری، انواع پویا | اجباری، انواع استاتیک |
| مثال | XmlPullParser.next(), SAX events | json.decodeFromString<User>() |
پارسینگ جریانی — مزیت اصلی پارسینگ بر دسریالیساسیون. 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")
// پردازش کاربر
}
پارسینگ دستی از طریق org.json زمانی مفید است که ساختار پاسخ از قبل ناشناخته باشد یا شدیداً متغیر باشد. این رویکرد کنترل کامل بر رسیدگی به خطا و فیلدهای nullable میدهد، اما در مقایسه با دسریالیساسیون خودکار به کد شابلونی بیشتری نیاز دارد. برای پروژههای کوچک یا نمونه قابل قبول است، اما در production Moshi یا kotlinx.serialization توصیه میشود.
JsonReader از کتابخانه Moshi — ابزاری قدرتمند برای پارسینگ جریانی JSON. سند را توکن به توکن میخواند و از روشهای beginObject، nextName، nextString، nextInt و endObject استفاده میکند. این رویکرد به شما امکان پردازش سندهای با اندازه دلخواه با مصرف حافظه ثابت را میدهد. به گزارش Google (2026)، پارسینگ جریانی از طریق 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 برای صادرات گزارشها، بارگذاری دایریها (فهرست کشورها، ارزها، کدها) و همگامسازی دادههای آفلاین استفاده میشود. برای پارسینگ CSV، کتابخانههای جریانی مناسب هستند: Apache Commons CSV و OpenCSV فایلها را خط به خط پردازش میکنند و گیلومها و کاما داخل مقادیر را پیش میگیرند. در iOS، پارسینگ CSV میتواند از طریق الگی 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(",") با مدیریت پیش گیری کافی است. برای پروژههای production با فایلهای CSV بزرگ، OpenCSV توصیه میشود.
Protocol Buffers از Google — فرمت سریالیسازی دودوی، برتر از JSON در سرعت و فشردگی. پیام Protobuf 3–6 برابر کمتر از JSON معادل فضا اشغال میکند و به دلیل فرمت دودویی و شماته سختگیر، 4–10 برابر سریعتر تجزیه میشود. معایب اصلی: نبود قابلیت خواندن توسط انسان و نیاز به تولید کد از فایلهای .proto از طریق کامپایلر protoc.
پارسینگ جریانی Protobuf از طریق CodedInputStream پیاده سازی میشود — مشترک فیلدها را بدون بارگذاری کل پیامؘ به محض ورود میخواند. هر فیلد یک تگ (شماره + نوع) دارد و پارسر میتواند فیلدهای ناشناخته را رد کند. به گزارش Google (2026)، تجزیه جریانی Protobuf افزایش پیامهای 1 MB را تا 90% حافظه کمتری مصرف میکند — این برای دستگاههای موبایل با حافظه RAM محدود حیاتی است. Protobuf-lite — نسخه ویژه برای Android، بهینهسازی شده بر اساس اندازه کد تولید شده.
پرسشهای متداول
JSONSerialization — پارسینگ دستی که Any (Dictionary, Array) را بدون تایپبندی بازمیگرداند. JSONDecoder — دسریالیساسیون خودکار به انواع Codable. JSONSerialization برای ساختارهای پویا انعطاف میدهد، JSONDecoder — سرعت و امنیت نوع برای شماتههای شناخته شده. در production JSONDecoder توصیه میشود.
پارسینگ جریانی اجباری است برای پاسخهای بالای 500 کیلوبایت، تجزیه خوراک RSS/Atom و تجزیه فایلها در دستگاههای با حافظه محدود. برای پاسخهای تیپیک API تا 100 کیلوبایت، دسریالیساسیون خودکار از طریق 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید