পার্সিং হল গঠনবদ্ধ ডেটার সিনট্যাকটিক বিশ্লেষণের প্রক্রিয়া, যা JSON, XML, CSV বা Protobuf থেকে তথ্য বের করে অ্যাপ্লিকেশনে ব্যবহারের জন্য। Square Engineering (2025) অনুযায়ী, পার্সিং কৌশলের পছন্দ সরাসরি মোবাইল অ্যাপ্লিকেশনের কর্মক্ষমতা প্রভাবিত করে। স্ট্রিমিং পার্সিং সম্পূর্ণ ডকুমেন্ট মেমরিতে লোড না করেই মেগাবাইট ডেটা প্রক্রিয়া করতে দেয়।
মূল বিষয়
পার্সিং (সিনট্যাকটিক বিশ্লেষণ) হল অক্ষরের ক্রমকে প্রোগ্রাম্যাটিক প্রক্রিয়াকরণের জন্য উপযোগী গঠনবদ্ধ উপস্থাপনায় রূপান্তরের প্রক্রিয়া। মোবাইল ডেভেলপমেন্টের প্রসঙ্গে, পার্সিং বলতে সার্ভার প্রতিক্রিয়া, কনফিগারেশন ফাইল, স্থানীয় ক্যাশ এবং রিসোর্স ফাইল প্রক্রিয়াকরণ বোঝায়। প্রতিটি ফরম্যাটের নিজস্ব পদ্ধতির প্রয়োজন: JSON — হালকা এবং SDK-তে অন্তর্নির্মিত, XML — XSD স্কিমা যাচাই সহ কঠোর, CSV — সারণীভুক্ত ডেটার জন্য ন্যূনতম, Protobuf — কঠোর স্কিমা সহ বাইনারি।
যেকোনো পার্সার, ফরম্যাট নির্বিশেষে, তিনটি ধাপের মধ্য দিয়ে যায়। লেক্সিকাল বিশ্লেষণ কাঁচা টেক্সটকে টোকেনে বিভক্ত করে: কী, স্ট্রিং, সংখ্যা, বিভাজক এবং মন্তব্য। সিনট্যাকটিক বিশ্লেষণ ব্যাকরণের সঠিকতা পরীক্ষা করে — JSON-এ বন্ধনী ভারসাম্য, XML-এ ট্যাগ নেস্টিংয়ের সঠিকতা। আউটপুট গঠন নির্মাণ একটি অবজেক্ট উপস্থাপনা তৈরি করে: JSONObject, Map, বা আরও প্রক্রিয়াকরণের জন্য টোকেন স্ট্রিম। Apple (2026) অনুযায়ী, iOS-এ অন্তর্নির্মিত Foundation পার্সার অলস পার্সিং ব্যবহার করে — এটি শুধুমাত্র 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 ইভেন্ট | json.decodeFromString<User>() |
স্ট্রিমিং পার্সিং ডিসিরিয়ালাইজেশনের উপর পার্সিংয়ের প্রধান সুবিধা। Android-এ XmlPullParser পড়ার সাথে সাথে XML পার্স করে, সম্পূর্ণ ডকুমেন্ট RAM-এ লোড না করেই। এটি বড় 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-এর মাধ্যমে ম্যানুয়াল পার্সিং উপযোগী যখন প্রতিক্রিয়া গঠন আগে থেকে অজানা বা ব্যাপকভাবে পরিবর্তিত হয়। এই পদ্ধতি ত্রুটি পরিচালনা এবং নালযোগ্য ফিল্ডের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয় কিন্তু স্বয়ংক্রিয় ডিসিরিয়ালাইজেশনের তুলনায় বেশি বয়লারপ্লেট কোড প্রয়োজন। ছোট প্রকল্প বা প্রোটোটাইপের জন্য এটি গ্রহণযোগ্য, কিন্তু উৎপাদনে Moshi বা kotlinx.serialization পছন্দ করা হয়।
JsonReader Moshi লাইব্রেরি থেকে স্ট্রিমিং JSON পার্সিংয়ের জন্য একটি শক্তিশালী টুল। এটি beginObject, nextName, nextString, nextInt এবং endObject পদ্ধতি ব্যবহার করে ডকুমেন্ট টোকেনের পর টোকেন পড়ে। এই পদ্ধতি ধ্রুবক মেমরি খরচ সহ যেকোনো আকারের ডকুমেন্ট প্রক্রিয়া করতে দেয়। Google (2026) অনুযায়ী, JsonReader-এর মাধ্যমে স্ট্রিমিং পার্সিং সম্পূর্ণ ডকুমেন্ট JsonObject-এ লোড করার চেয়ে 2-3 গুণ দ্রুত এবং 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-এ ৫০টি ফিল্ড থাকে কিন্তু মাত্র ৩টির প্রয়োজন হয়। ফলাফল ন্যূনতম মেমরি খরচ এবং সর্বোচ্চ গতি।
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
}
}
RSS ফিড পার্স করার জন্য iOS-এ XMLParser ডেলিগেটের উদাহরণ। didStartElement পদ্ধতি প্রতিটি খোলা ট্যাগে কল করা হয়, foundCharacters ট্যাগের মধ্যে টেক্সট সামগ্রী ফেরত দেয়, didEndElement উপাদানটি সম্পূর্ণ করে। এই ইভেন্ট-ভিত্তিক আর্কিটেকচার DOM ট্রি মেমরিতে লোড না করেই যেকোনো আকারের XML প্রক্রিয়া করতে দেয় — মোবাইল ডিভাইসের সীমিত সম্পদের জন্য গুরুত্বপূর্ণ।
Android-এ, CSV পার্সারের পছন্দ ডেটার পরিমাণের উপর নির্ভর করে। OpenCSV একটি ফ্লুয়েন্ট API, POJO ম্যাপিংয়ের জন্য অ্যানোটেশন এবং কাস্টম ডেলিমিটার সমর্থন করে। Apache Commons CSV বেশি নিম্ন-স্তরের কিন্তু বড় ফাইলে দ্রুত। সহজ ক্ষেত্রে (1-2 কলাম), এস্কেপ হ্যান্ডলিং সহ String.split(",")-এর মাধ্যমে ম্যানুয়াল পার্সিং যথেষ্ট। বড় CSV ফাইল সহ উৎপাদন প্রকল্পের জন্য, OpenCSV সুপারিশ করা হয়।
Google-এর Protocol Buffers একটি বাইনারি সিরিয়ালাইজেশন ফরম্যাট যা গতি এবং কম্প্যাক্টনেসে JSON-কে ছাড়িয়ে যায়। একটি Protobuf বার্তা সমতুল্য JSON-এর তুলনায় 3-6 গুণ কম জায়গা নেয় এবং তার বাইনারি ফরম্যাট ও কঠোর স্কিমার কারণে 4-10 গুণ দ্রুত পার্স হয়। প্রধান ত্রুটিগুলি হল মানব-পাঠযোগ্যতার অভাব এবং protoc কম্পাইলারের মাধ্যমে .proto ফাইল থেকে কোড জেনারেট করার প্রয়োজন।
স্ট্রিমিং Protobuf পার্সিং CodedInputStream-এর মাধ্যমে বাস্তবায়িত হয় — ক্লায়েন্ট পুরো বার্তা লোড না করেই ফিল্ড আসার সাথে সাথে পড়ে। প্রতিটি ফিল্ডের একটি ট্যাগ (সংখ্যা + প্রকার) থাকে এবং পার্সার অজানা ফিল্ড এড়িয়ে যেতে পারে। Google (2026) অনুযায়ী, স্ট্রিমিং Protobuf পার্সিং 1 MB থেকে বার্তা প্রক্রিয়া করার সময় 90% পর্যন্ত কম মেমরি খরচ করে, যা সীমিত RAM সহ মোবাইল ডিভাইসের জন্য গুরুত্বপূর্ণ। Protobuf-lite Android-এর জন্য একটি বিশেষ সংস্করণ, জেনারেটেড কোড আকারের জন্য অপ্টিমাইজড।
সচরাচর জিজ্ঞাসা
JSONSerialization হল ম্যানুয়াল পার্সিং যা টাইপিং ছাড়াই Any (Dictionary, Array) ফেরত দেয়। JSONDecoder হল Codable টাইপে স্বয়ংক্রিয় ডিসিরিয়ালাইজেশন। JSONSerialization গতিশীল গঠনের জন্য নমনীয়তা প্রদান করে, যখন JSONDecoder পরিচিত স্কিমার জন্য গতি এবং টাইপ সুরক্ষা প্রদান করে। উৎপাদনে, JSONDecoder সুপারিশ করা হয়।
500 KB-র বেশি প্রতিক্রিয়ার জন্য, RSS/Atom ফিড পার্স করার সময় এবং সীমিত মেমরি সহ ডিভাইসে ফাইল প্রক্রিয়া করার সময় স্ট্রিমিং পার্সিং বাধ্যতামূলক। 100 KB পর্যন্ত সাধারণ API প্রতিক্রিয়ার জন্য, JSONDecoder বা Moshi-এর মাধ্যমে স্বয়ংক্রিয় ডিসিরিয়ালাইজেশন উত্তম — পরিষ্কার কোড এবং দ্রুত ডেভেলপমেন্ট।
Android SDK-তে org.json (JSONObject, JSONArray), XmlPullParser (XML), এবং android.util.JsonReader অন্তর্ভুক্ত। CSV, YAML এবং Protobuf-এর জন্য অতিরিক্ত লাইব্রেরি প্রয়োজন: CSV-র জন্য OpenCSV, YAML-এর জন্য SnakeYAML, Protobuf-এর জন্য protobuf-javalite।
kotlinx.serialization-এ lenient মোড বা Moshi-তে JsonReader.setLenient(true) ব্যবহার করুন — এটি অতিরিক্ত কমা, আনএস্কেপড উদ্ধৃতি এবং একক-লাইন মন্তব্য ক্ষমা করে। সম্পূর্ণ যাচাইয়ের জন্য, Pact বা Spring Cloud Contract-এর মাধ্যমে কন্ট্রাক্ট টেস্টিং বাস্তবায়ন করুন।
SAX (Simple API for XML) একটি স্ট্রিমিং XML পার্সার যা ডকুমেন্ট অতিক্রম করার সময় startElement, characters, endElement ইভেন্ট তৈরি করে। এটি Android-এ XmlPullParser এবং iOS-এ XMLParser-এর মাধ্যমে বাস্তবায়িত হয়। এটি RSS রিডার, অফলাইন ডেটা সিঙ্ক্রোনাইজেশন এবং SVG ফাইল প্রক্রিয়াকরণে ব্যবহৃত হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন