پارسینگ در برنامه‌های موبایل: ماهیت، فرمت‌های داده و فرآیند

نویسنده: IT Sectr منتشر شده: 2026-03-08 زمان مطالعه: 8 دقیقه

پارسینگ — فرآیند تجزیه و تحلیل سنتاکتیکی داده‌های ساختاریافته است که اطلاعات را از JSON، XML، CSV یا Protobuf برای استفاده در برنامه استخراج می‌کند. به گزارش Square Engineering (2025)، انتخاب راهبرد پارسینگ مستقیماً بر عملکرد برنامه موبایل تأثیر می‌گذارد. پارسینگ جریانی به شما امکان پردازش مگابایت‌ها داده را بدون بارگذاری کل سند در حافظه می‌دهد.

نکات کلیدی

  • پارسینگ — تجزیه متن ساختاریافته به لکسم‌ها برای استخراج داده بدون تایپ‌بندی اجباری.
  • JSON — محبوبترین فرمت برای REST API در برنامه‌های موبایل در iOS و Android.
  • پارسینگ جریانی در تجزیه فایل‌های بزرگ و خوراک RSS صرفه‌جویی حافظه می‌کند.
  • Code generation — پارسر را در مرحله کامپایل تولید می‌کند و زمان runtime را 2–4 برابر تسریع می‌بخشد.
  • Protobuf — فرمت دودوی، 3–6 برابر فشرده‌تر از JSON و سریع‌تر در پارسینگ.

پارسینگ چیست؟

پارسینگ (تجزیه و تحلیل سنتاکتیکی) — فرآیند تبدیل تسلسل نشانه‌ها به یک نمایش ساختاریافته قابل استفاده برای پردازش برنامه‌ای. در زمینه توسعه موبایل، پارسینگ به معنای تجزیه و تحلیل پاسخ‌های سرور، فایل‌های پیکربندی، کش محلی و فایل‌های منابع است. هر فرمت رویکرد خاص خود را نیاز دارد: 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 eventsjson.decodeFromString<User>()

پارسینگ جریانی — مزیت اصلی پارسینگ بر دسریالیساسیون. XmlPullParser در Android XML را هنگام خواندن تجزیه می‌کند و کل سند را در حافظه فعال بارگذاری نمی‌کند. این برای پاسخ‌های بزرگ API، تجزیه خوراک RSS با صدها عنصر یا پردازش ماتریسی از هزاران شیئ JSON از دامپ سرور بهینه است. پارسر جریانی توکن به توکن می‌خواند و مقدار ثابتی از حافظه صرف نظر از اندازه سند مصرف می‌کند.

پارسینگ JSON در برنامه‌های موبایل

JSON — فرمت غالب تبادل داده. در iOS، JSONSerialization ساخته JSON را به Any و JSONDecoder را مستقیماً به ساختار Codable تبدیل می‌کند. در Android، org.json استاندارد JSONObject و JSONArray را برای تجزیه دستی فراهم می‌کند. Gson و Moshi تبدیل خودکار را اضافه می‌کنند. انتخاب بین رویکرد دستی و خودکار — اولین تصمیم معماری لایه شبکه.

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")
    // پردازش کاربر
}

پارسینگ دستی از طریق org.json زمانی مفید است که ساختار پاسخ از قبل ناشناخته باشد یا شدیداً متغیر باشد. این رویکرد کنترل کامل بر رسیدگی به خطا و فیلدهای nullable می‌دهد، اما در مقایسه با دسریالیساسیون خودکار به کد شابلونی بیشتری نیاز دارد. برای پروژه‌های کوچک یا نمونه قابل قبول است، اما در production Moshi یا kotlinx.serialization توصیه می‌شود.

JSONReader برای تجزیه جریانی

JsonReader از کتابخانه Moshi — ابزاری قدرتمند برای پارسینگ جریانی JSON. سند را توکن به توکن می‌خواند و از روش‌های beginObject، nextName، nextString، nextInt و endObject استفاده می‌کند. این رویکرد به شما امکان پردازش سندهای با اندازه دلخواه با مصرف حافظه ثابت را می‌دهد. به گزارش Google (2026)، پارسینگ جریانی از طریق JsonReader 2–3 برابر سریع‌تر از بارگذاری کل سند در JsonObject است و تا 80% حافظه کمتری مصرف می‌کند.

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

در مثال JsonReader نشان داده شده است که JSON را جریانی تجزیه می‌کند. هر فراخوانی nextName() و nextInt() کرسور را به توکن بعدی حرکت می‌دهد. skipValue() فیلدهای غیرضروری را بدون تجزیه رد می‌کند — این وقتی که JSON شامل 50 فیلد است و فقط 3 تا مورد نیاز است به ویژه مفید است. نتیجه — حداقل مصرف حافظه و حداکثر سرعت.

پارسینگ XML و CSV

XML هنوز در پروژه‌های Android برای منابع و در خدمات SOAP برنامه‌های سازمانی استفاده می‌شود. در Android، XmlPullParser ساخته تجزیه جریانی را با حداقل مصرف حافظه فراهم می‌کند — درخت DOM را بارگذاری نمی‌کند، بلکه رویدادهای START_TAG، TEXT، END_TAG را تولید می‌کند. iOS از XMLParser با رویکرد دلگاتی استفاده می‌کند: روش‌های parser(didStartElement:) و parser(foundCharacters:) عناصر را به ترتیب پردازش می‌کنند.

CSV در توسعه موبایل

CSV — سادهترین فرمت برای صادرات و واردات داده‌های جدولی. در برنامه‌های موبایل، CSV برای صادرات گزارش‌ها، بارگذاری دایری‌ها (فهرست کشورها، ارزها، کدها) و همگام‌سازی داده‌های آفلاین استفاده می‌شود. برای پارسینگ CSV، کتابخانه‌های جریانی مناسب هستند: Apache Commons CSV و OpenCSV فایل‌ها را خط به خط پردازش می‌کنند و گیلوم‌ها و کاما داخل مقادیر را پیش می‌گیرند. در iOS، پارسینگ CSV می‌تواند از طریق الگی NSString.components(separatedBy:) با مدیریت موارد حاشیه‌ای انجام شود.

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

مثال دلگات XMLParser در iOS برای تجزیه خوراک RSS. روش didStartElement در هر تگ باز شونده فراخوان می‌شود، foundCharacters محتوای متنی بین تگ‌ها را بازمی‌گرداند، didEndElement عنصر را خاتمه می‌دهد. چنین معماری رویدادگرا به شما امکان پردازش XML با هر اندازه‌ای را بدون بارگذاری درخت DOM در حافظه می‌دهد — برای منابع محدود دستگاه‌های موبایل حیاتی است.

مقایسه کتابخانه‌های CSV برای Android

در Android، انتخاب پارسر CSV به حجم داده بستگی دارد. OpenCSV از fluent API، توضیحات برای نقشه‌برداری به POJO و جداکننده‌های سفارشی پشتیبانی می‌کند. Apache Commons CSV — سطح پایین‌تر، اما در فایل‌های بزرگ سریع‌تر. برای موارد ساده (1–2 ستون)، تجزیه دستی از طریق String.split(",") با مدیریت پیش گیری کافی است. برای پروژه‌های production با فایل‌های CSV بزرگ، OpenCSV توصیه می‌شود.

Protobuf و پارسینگ جریانی

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 و JSONDecoder چیست؟

JSONSerialization — پارسینگ دستی که Any (Dictionary, Array) را بدون تایپ‌بندی بازمی‌گرداند. JSONDecoder — دسریالیساسیون خودکار به انواع Codable. JSONSerialization برای ساختارهای پویا انعطاف می‌دهد، JSONDecoder — سرعت و امنیت نوع برای شماته‌های شناخته شده. در production JSONDecoder توصیه می‌شود.

کی به جای بارگذاری کل سند از پارسینگ جریانی استفاده کنیم؟

پارسینگ جریانی اجباری است برای پاسخ‌های بالای 500 کیلوبایت، تجزیه خوراک RSS/Atom و تجزیه فایل‌ها در دستگاه‌های با حافظه محدود. برای پاسخ‌های تیپیک API تا 100 کیلوبایت، دسریالیساسیون خودکار از طریق JSONDecoder یا Moshi ترجیح دارد — کد تمیزتر و سریع‌تر توسعه می‌یابد.

چه فرمت‌های داده‌ای در Android SDK به صورت داخلی پشتیبانی می‌شوند؟

Android SDK شامل org.json (JSONObject, JSONArray)، XmlPullParser (XML) و android.util.JsonReader است. برای CSV، YAML و Protobuf کتابخانه‌های افزوده لازم است: OpenCSV برای CSV، SnakeYAML برای YAML، protobuf-javalite برای Protobuf.

در صورت JSON نامناسب از سرور چه کنیم؟

از حالت lenient در kotlinx.serialization یا JsonReader.setLenient(true) در Moshi استفاده کنید — کاماهای اضافی، گیلوم‌های پیش گیری نشده و توضیحات یک خطی را نادیده می‌گیرد. برای اعتبارسنجی کامل، آزمون قراردادی را از طریق Pact یا Spring Cloud Contract پیاده کنید.

SAX parsing چیست و کجا استفاده می‌شود؟

SAX (Simple API for XML) — پارسر جریانی XML است که در طول پیمایش سند رویدادهای startElement، characters، endElement را تولید می‌کند. از طریق XmlPullParser در Android و XMLParser در iOS پیاده سازی شده است. در خواننده‌های RSS، همگام‌سازی داده‌های آفلاین و پردازش فایل‌های SVG استفاده می‌شود.

خلاصه

  • پارسینگ — عملیات بنیادین تجزیه داده‌های ساختاریافته، وسیع‌تر از دسریالیساسیون: می‌تواند جریانی باشد و نیازی به تایپ‌بندی نداشته باشد.
  • JSON — فرمت اصلی برای REST API در توسعه موبایل؛ توسط JSONSerialization (iOS) و org.json (Android) پشتیبانی می‌شود.
  • پارسینگ جریانی از طریق JsonReader، XmlPullParser و SAX در حافظه صرفه‌جویی کرده و برای سندهای بزرگ حیاتی است.
  • Protobuf — سریع‌ترین و فشرده‌ترین فرمات، توصیه شده برای سیستم‌های با بار بالا و چند سیستمی.
  • XMLPullParser در Android و XMLParser در iOS — ابزارهای استاندارد پارسینگ جریانی XML با مدل رویدادگرا.
  • پارسرهای CSV (OpenCSV، Apache Commons CSV) برای صادرات گزارش‌ها و بارگذاری داده‌های مرجع مفید هستند.
  • انتخاب بین پارسینگ دستی و خودکار به حجم داده، تغییرپذیری شماته و نیازهای حافظه دستگاه بستگی دارد.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید