JSONSerialization — Foundation ফ্রেমওয়ার্কের একটি বিল্ট-ইন iOS ক্লাস যা JSON কে Foundation অবজেক্টে রূপান্তর এবং পুনরুদ্ধারের জন্য ডিজাইন করা হয়েছে। এই APIটি থার্ড-পার্টি লাইব্রেরি ছাড়াই Apple প্ল্যাটফর্মে JSON নিয়ে কাজ করার মৌলিক প্রক্রিয়া, যা ডিকশনারি, অ্যারে এবং প্রিমিটিভ টাইপের পার্সিং সমর্থন করে। Apple Developer, 2024 অনুসারে, JSONSerialization নমনীয় JSON ডেটা প্রক্রিয়াকরণের জন্য Data, স্ট্রিম এবং পড়ার অপশন নিয়ে কাজ করা সমর্থন করে।
মূল বিষয়
JSONSerialization Foundation ফ্রেমওয়ার্কের একটি ক্লাস যা iOS, macOS, tvOS এবং watchOS-এ উপলব্ধ। এটি JSON Data কে Foundation অবজেক্টে (NSDictionary, NSArray, NSString, NSNumber) রূপান্তর এবং পুনরুদ্ধারের পদ্ধতি প্রদান করে। ক্লাসটি iOS 5-এ আবির্ভূত হয় এবং Codable (Swift 4) প্রবর্তনের আগ পর্যন্ত Apple প্ল্যাটফর্মে JSON নিয়ে কাজ করার প্রাথমিক উপায় ছিল। বয়স সত্ত্বেও, JSONSerialization লিগ্যাসি Objective-C প্রকল্পে এবং যেখানে নির্দিষ্ট মডেল স্কিমা ছাড়া ডায়নামিক JSON প্রক্রিয়াকরণ প্রয়োজন এমন পরিস্থিতিতে প্রাসঙ্গিক রয়ে গেছে।
Codable আগমন সত্ত্বেও, JSONSerialization বিভিন্ন পরিস্থিতিতে প্রাসঙ্গিক রয়ে গেছে। ডায়নামিক JSON গঠন — যখন প্রতিক্রিয়া বিন্যাস পরিবর্তন হয় বা আগে থেকে অজানা থাকে — কীর মাধ্যমে ডিকশনারি অ্যাক্সেস প্রয়োজন, যা JSONSerialization-এর মাধ্যমে করা সহজ। ক্লাসটি Objective-C প্রকল্পেও ব্যবহৃত হয় যেখানে Codable উপলব্ধ নয়, এবং বড় JSON ফাইলের ক্রমিক পার্সিংয়ের জন্য স্ট্রিম নিয়ে কাজ করার সময়। পরীক্ষা এবং মকআপে, isValidJSONObject এবং data(withJSONObject:options:) থার্ড-পার্টি লাইব্রেরি ছাড়াই দ্রুত JSON ফিক্সচার তৈরি করতে দেয়, যা উন্নয়ন এবং প্রোটোটাইপিংকে ত্বরান্বিত করে।
import Foundation
// JSONSerialization ব্যবহারের মৌলিক কাঠামো
let jsonString = """
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}
"""
guard let jsonData = jsonString.data(using: .utf8) else {
return
}
do {
let json = try JSONSerialization
.jsonObject(with: jsonData,
options: .mutableContainers)
print(json)
} catch {
print("JSON পার্স ত্রুটি: \(error)")
}
JSONSerialization JSON নিয়ে কাজ করার জন্য চারটি প্রধান পদ্ধতি প্রদান করে। প্রধান পদ্ধতি হল jsonObject(with:options:), যা Data কে Foundation অবজেক্টে রূপান্তর করে। data(withJSONObject:options:) পদ্ধতি বিপরীত সিরিয়ালাইজেশন সম্পাদন করে। isValidJSONObject(_:) যাচাই করে কোনো অবজেক্ট সিরিয়ালাইজ করা যায় কিনা। writeJSONObject(_:to:options:error:) সরাসরি স্ট্রিমে JSON লেখে। InputStream থেকে JSON পড়ার জন্য, jsonObject(with:options:) পদ্ধতি রয়েছে যা Data-এর পরিবর্তে স্ট্রিম গ্রহণ করে, যা স্ট্রিমিং ডেটা ফেরত দেয় এমন নেটওয়ার্ক অনুরোধের সাথে সংহত করার সময় সুবিধাজনক।
jsonObject পদ্ধতি Data গ্রহণ করে এবং Any ফেরত দেয় — সাধারণত NSDictionary বা NSArray। নিরাপদ ব্যবহারের জন্য, ফলাফল শর্তসাপেক্ষ কাস্টিংয়ের মাধ্যমে প্রত্যাশিত টাইপে রূপান্তরিত হয়। data পদ্ধতি একটি Foundation অবজেক্ট গ্রহণ করে এবং JSON উপস্থাপনা সহ Data ফেরত দেয়। .prettyPrinted অপশন পঠনযোগ্যতার জন্য ইন্ডেন্টেশন সহ ফর্ম্যাটিং যোগ করে।
let jsonString = """
{
"products": [
{"id": 1, "name": "iPhone", "price": 999},
{"id": 2, "name": "iPad", "price": 799}
]
}
"""
let data = Data(jsonString.utf8)
if let json = try? JSONSerialization
.jsonObject(with: data) as? [String: Any],
let products = json["products"] as? [[String: Any]] {
for product in products {
if let name = product["name"] as? String {
print("পণ্য: \(name)")
}
}
}
// বিপরীত সিরিয়ালাইজেশন: অবজেক্ট -> JSON
let outputDict: [String: Any] = ["status": "ok", "count": 42]
if let outputData = try? JSONSerialization
.data(withJSONObject: outputDict,
options: .prettyPrinted) {
String(data: outputData, encoding: .utf8)
}
মৌলিক পার্সিং প্রিমিটিভ টাইপের একটি ডিকশনারির JSONSerialization-এর সাথে সবচেয়ে সাধারণ অপারেশন। URLSession-এর মাধ্যমে Data পাওয়ার পর, ডেভেলপার jsonObject কল করে এবং ফলাফলকে প্রত্যাশিত টাইপে রূপান্তর করে। অবজেক্টের অ্যারের জন্য, [[String: Any]]-এ কাস্টিং ব্যবহার করা হয়, তারপরে প্রতিটি উপাদান একটি লুপে প্রক্রিয়াজাত করা হয়। এই পদ্ধতি নমনীয় কিন্তু ম্যানুয়াল টাইপ ব্যবস্থাপনা প্রয়োজন।
বাস্তব API অ্যারে, তারিখ এবং ঐচ্ছিক ক্ষেত্র সহ জটিল নেস্টেড JSON অবজেক্ট ফেরত দেয়। JSONSerialization যেকোনো নেস্টিং গভীরতা সঠিকভাবে পরিচালনা করে, কিন্তু ডেভেলপারকে স্বাধীনভাবে প্রতিটি স্তরকে প্রয়োজনীয় টাইপে রূপান্তর করতে হবে। এই কাজটি সহজ করার জন্য, Apple টাইপকৃত ডেটার জন্য Codable এবং শুধুমাত্র ডায়নামিক কাঠামোর জন্য JSONSerialization ব্যবহার করার পরামর্শ দেয়।
// API প্রতিক্রিয়ার পার্সিং
func parseUserResponse(data: Data) {
do {
guard let json = try JSONSerialization
.jsonObject(with: data) as? [String: Any]
else { return }
guard let userId = json["id"] as? Int,
let name = json["name"] as? String
else {
throw ParsingError.missingField
}
print("ব্যবহারকারী: \(name) (ID: \(userId))")
} catch let error as ParsingError {
print("পার্স ব্যর্থ: \(error)")
} catch {
print("অপ্রত্যাশিত ত্রুটি: \(error)")
}
}
enum ParsingError: Error {
case missingField
case invalidType
}
JSONSerialization অবৈধ JSON, টাইপ অমিল বা নেস্টিং গভীরতা অতিক্রম করলে ত্রুটি নিক্ষেপ করে। ত্রুটিগুলি CocoaError টাইপের এবং সমস্যা বর্ণনাকারী কোড ধারণ করে। ডেভেলপারকে do-catch কনস্ট্রাক্টের মাধ্যমে সেগুলি পরিচালনা করতে হবে, অন্যথায় অ্যাপ্লিকেশন ক্র্যাশ হবে। সবচেয়ে সাধারণ ত্রুটিগুলি হল: NSPropertyListReadCorruptError (অবৈধ JSON) এবং NSPropertyListReadUnknownError। প্রতিটি ত্রুটির ধরণের নিজস্ব পরিচালনা কৌশল প্রয়োজন: অবৈধ বিন্যাসের জন্য, ডেটা পুনরায় পাঠানোর অনুরোধ করুন এবং কাঠামো অমিলের জন্য, পার্সিং মডেল আপডেট করুন।
অবৈধ JSON — ব্যর্থতার সবচেয়ে সাধারণ কারণ: একটি অনুপস্থিত কমা, অতিরিক্ত অক্ষর বা আনএস্কেপড উদ্ধৃতি সম্পূর্ণ পার্সিং ভেঙে দেয়। দ্বিতীয় ধরণের ত্রুটি হল প্রত্যাশিত কাঠামোর সাথে অমিল: উদাহরণস্বরূপ, সার্ভার ডিকশনারির পরিবর্তে একটি অ্যারে ফেরত দিয়েছে। JSONSerialization.fragmentsAllowed সেই JSON পড়ার অনুমতি দেয় যার মূল ডিকশনারি বা অ্যারে নয় বরং একটি প্রিমিটিভ মান। ডেভেলপার নেস্টিং গভীরতা অতিক্রমের ত্রুটির সম্মুখীন হতে পারে যখন JSON-এ খুব বেশি স্তর থাকে।
JSONSerialization পার্সিং কনফিগার করার জন্য বেশ কয়েকটি অপশন প্রদান করে। .mutableContainers অপরিবর্তনীয় সংস্করণের পরিবর্তে NSMutableDictionary এবং NSMutableArray ফেরত দেয়, যা পার্সিংয়ের পরে ডেটা পরিবর্তন করার সময় কার্যকর। .mutableLeaves স্ট্রিং মানগুলিকে পরিবর্তনীয় করে। .fragmentsAllowed সেই JSON অনুমতি দেয় যার মূল কোনো অবজেক্ট বা অ্যারে নয় বরং একটি স্ট্রিং বা সংখ্যা — সহজ API প্রতিক্রিয়ার জন্য সুবিধাজনক। .withoutEscapingSlashes এবং .sortedKeys অপশন data(withJSONObject:options:) পদ্ধতির জন্য উপলব্ধ, সিরিয়ালাইজড JSON-এর ফর্ম্যাটিং নিয়ন্ত্রণ করে। অপশনগুলি বিটমাস্ক হিসাবে পাস করা হয়, যা | অপারেটরের মাধ্যমে একাধিক মান একত্রিত করার অনুমতি দেয় নমনীয় পার্সিং কনফিগারেশনের জন্য।
// বিভিন্ন ধরণের ত্রুটি পরিচালনা
func safeParse(jsonData: Data) {
do {
let object = try JSONSerialization
.jsonObject(with: jsonData,
options: .fragmentsAllowed)
if let dictionary = object as? [String: Any] {
print("\(dictionary.count) কীসহ ডিকশনারি")
} else if let array = object as? [Any] {
print("\(array.count) আইটেমসহ অ্যারে")
}
} catch CocoaError.propertyListReadCorrupt {
print("দূষিত JSON ডেটা")
} catch let error as CocoaError {
print("Cocoa ত্রুটি: \(error)")
} catch {
print("অজানা ত্রুটি: \(error)")
}
}
// সিরিয়ালাইজেশনের আগে অবজেক্টের বৈধতা যাচাই
let testObject: [String: Any] = ["key": "value", "nested": ["a": 1]]
if JSONSerialization.isValidJSONObject(testObject) {
print("বৈধ JSON অবজেক্ট")
}
JSONSerialization-এর কর্মক্ষমতা ডেটার আকার এবং কল ফ্রিকোয়েন্সির উপর নির্ভর করে। একটি ছোট সার্ভার প্রতিক্রিয়ার একক পার্সিংয়ের জন্য, পার্থক্য নগণ্য, কিন্তু দশ মেগাবাইট JSON বা লুপে ঘন ঘন কল প্রক্রিয়া করার সময়, টাইপ কাস্টিং থেকে ওভারহেড বিবেচনা করা উচিত। JSONSerialization বর্তমান থ্রেডে সমলয়ভাবে কাজ করে, তাই বড় ডকুমেন্টের জন্য DispatchQueue.global()-এর মাধ্যমে পার্সিংকে ব্যাকগ্রাউন্ড কিউতে স্থানান্তর করার পরামর্শ দেওয়া হয়। বিকল্পভাবে, আপনি সম্পূর্ণ ফাইল মেমরিতে লোড না করে স্ট্রিমিং প্রক্রিয়াকরণের জন্য InputStream ব্যবহার করতে পারেন, যা সীমিত সম্পদযুক্ত অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ। ফাইল বা নেটওয়ার্ক স্ট্রিমে JSON লেখার জন্য, writeJSONObject(_:to:options:error:) পদ্ধতি মধ্যবর্তী Data অবজেক্ট তৈরি না করে সরাসরি OutputStream-এ সিরিয়ালাইজড ডেটা পাঠানোর অনুমতি দেয়, যা বড় ডকুমেন্ট নিয়ে কাজ করার সময় মেমরি খরচ কমায়।
সচরাচর জিজ্ঞাসা
JSONSerialization একটি Foundation ক্লাস যা JSON Data কে Foundation অবজেক্টে (NSDictionary, NSArray) এবং পুনরুদ্ধারে রূপান্তরের জন্য। এটি অতিরিক্ত লাইব্রেরি ছাড়াই iOS, macOS, tvOS এবং watchOS-এ কাজ করে।
Codable স্বয়ংক্রিয় টাইপকৃত সিরিয়ালাইজেশনের জন্য একটি Swift প্রোটোকল যা টাইপ-নিরাপদ কোডে কম্পাইল হয়। JSONSerialization ডায়নামিক Any টাইপ নিয়ে কাজ করে এবং ম্যানুয়াল কাস্টিং প্রয়োজন। Codable নতুন প্রকল্পের জন্য পছন্দনীয়, JSONSerialization Objective-C এবং ডায়নামিক ডেটার জন্য।
jsonObject কল করার সময় do-catch কনস্ট্রাক্ট ব্যবহার করুন। JSONSerialization ত্রুটিগুলি CocoaError-এর অন্তর্ভুক্ত। ডিবাগিংয়ের জন্য, NSPropertyListReadCorruptError পরীক্ষা করুন, যা অবৈধ JSON ডেটা বিন্যাস নির্দেশ করে।
হ্যাঁ, JSONSerialization ডিকশনারি এবং অ্যারের যেকোনো নেস্টিং গভীরতা সমর্থন করে। সমস্ত নেস্টেড অবজেক্ট সংশ্লিষ্ট Foundation টাইপে (NSDictionary, NSArray, NSString, NSNumber) রূপান্তরিত হয়, মূল JSON কাঠামো সংরক্ষণ করে।
JSONSerialization ডায়নামিক JSON কাঠামোর জন্য, Objective-C প্রকল্পে, স্ট্রিম নিয়ে কাজ করার সময় এবং isValidJSONObject-এর মাধ্যমে JSON বৈধতা যাচাইয়ের জন্য উপযুক্ত। পরিচিত স্কিমা সহ টাইপকৃত কাঠামোর জন্য, Codable পছন্দনীয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন