JSON এবং Serialization (JSON এবং সিরিয়ালাইজেশন) in Dart
JSON (JavaScript Object Notation) একটি জনপ্রিয় ডেটা বিন্যাস যা মূলত তথ্য বিনিময়ের জন্য ব্যবহৃত হয়। Dart-এ JSON ডেটা পরিচালনা করতে এবং অবজেক্টগুলিকে JSON স্ট্রিংয়ে সিরিয়ালাইজ (রূপান্তরিত) এবং JSON স্ট্রিং থেকে অবজেক্টে ডেসিরিয়ালাইজ (পুনরুদ্ধার) করতে dart:convert লাইব্রেরি ব্যবহার করা হয়।
১. JSON কী?
JSON একটি মানবপঠনযোগ্য ডেটা বিন্যাস যা মূলত কী-মূল্য জোড় এবং অ্যারের সমন্বয়ে গঠিত। এটি অনেক প্রোগ্রামিং ভাষায় সমর্থিত এবং সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা বিনিময়ের জন্য খুবই জনপ্রিয়।
JSON এর একটি উদাহরণ:
{
"name": "Alice",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science"]
}
২. Dart-এ JSON ব্যবহার
Dart-এ JSON ব্যবহার করার জন্য dart:convert লাইব্রেরিটি ইম্পোর্ট করতে হবে।
import 'dart:convert';
৩. সিরিয়ালাইজেশন (Serialization)
Serialization হল একটি অবজেক্টকে JSON ফরম্যাটে রূপান্তর করার প্রক্রিয়া। Dart-এ একটি অবজেক্টকে JSON-এ রূপান্তর করতে jsonEncode ফাংশন ব্যবহার করা হয়।
উদাহরণ: সিরিয়ালাইজেশন
void main() {
// Create a Map representing a user
Map<String, dynamic> user = {
'name': 'Alice',
'age': 30,
'isStudent': false,
'courses': ['Math', 'Science'],
};
// Serialize the Map to JSON
String jsonString = jsonEncode(user);
print(jsonString); // Output: {"name":"Alice","age":30,"isStudent":false,"courses":["Math","Science"]}
}
৪. ডেসিরিয়ালাইজেশন (Deserialization)
Deserialization হল JSON ফরম্যাট থেকে অবজেক্টে রূপান্তর করার প্রক্রিয়া। Dart-এ JSON স্ট্রিং থেকে অবজেক্ট তৈরি করতে jsonDecode ফাংশন ব্যবহার করা হয়।
উদাহরণ: ডেসিরিয়ালাইজেশন
void main() {
String jsonString = '{"name":"Alice","age":30,"isStudent":false,"courses":["Math","Science"]}';
// Deserialize the JSON string to a Map
Map<String, dynamic> user = jsonDecode(jsonString);
print('Name: ${user['name']}'); // Output: Name: Alice
print('Age: ${user['age']}'); // Output: Age: 30
print('Is Student: ${user['isStudent']}'); // Output: Is Student: false
print('Courses: ${user['courses']}'); // Output: Courses: [Math, Science]
}
৫. কাস্টম অবজেক্ট সিরিয়ালাইজেশন
Dart-এ কাস্টম ক্লাসের জন্য সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন তৈরি করতে, আপনি আপনার ক্লাসে দুটি মেথড সংজ্ঞায়িত করতে পারেন: একটি JSON-এ রূপান্তরের জন্য এবং অন্যটি JSON থেকে রূপান্তরের জন্য।
উদাহরণ: কাস্টম ক্লাসের জন্য সিরিয়ালাইজেশন
class User {
String name;
int age;
bool isStudent;
List<String> courses;
User({required this.name, required this.age, required this.isStudent, required this.courses});
// Serialize User to JSON
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'isStudent': isStudent,
'courses': courses,
};
}
// Deserialize JSON to User
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
isStudent: json['isStudent'],
courses: List<String>.from(json['courses']),
);
}
}
void main() {
// Create a User instance
User user = User(name: 'Alice', age: 30, isStudent: false, courses: ['Math', 'Science']);
// Serialize User to JSON
String jsonString = jsonEncode(user.toJson());
print(jsonString); // Output: {"name":"Alice","age":30,"isStudent":false,"courses":["Math","Science"]}
// Deserialize JSON back to User
User newUser = User.fromJson(jsonDecode(jsonString));
print('Name: ${newUser.name}, Age: ${newUser.age}'); // Output: Name: Alice, Age: 30
}
উপসংহার
Dart-এ JSON এবং Serialization ডেটা বিনিময় এবং পরিচালনার জন্য একটি সহজ এবং কার্যকরী উপায়। dart:convert লাইব্রেরির মাধ্যমে, আপনি অবজেক্টকে JSON-এ সিরিয়ালাইজ এবং JSON থেকে অবজেক্টে ডেসিরিয়ালাইজ করতে পারেন। এই বৈশিষ্ট্যগুলি ডেভেলপারদের জন্য তাদের অ্যাপ্লিকেশনগুলির মধ্যে তথ্য বিনিময়ের ক্ষমতা বৃদ্ধি করে।
JSON এর মৌলিক ধারণা
JSON (JavaScript Object Notation) একটি জনপ্রিয় এবং মানবপঠনযোগ্য ডেটা বিন্যাস, যা মূলত তথ্য বিনিময়ের জন্য ব্যবহৃত হয়। এটি বিভিন্ন প্রোগ্রামিং ভাষায় সহজে পড়া এবং লেখা যায় এবং এটি দ্রুত এবং কার্যকরী ডেটা স্থানান্তরের জন্য বিশেষভাবে উপযোগী।
১. JSON এর গঠন
JSON একটি কী-মূল্য জোড় এবং অ্যারের সমন্বয়ে গঠিত। এটি সাধারণত নিচের উপাদানগুলির সমন্বয়ে থাকে:
- অবজেক্ট:
{}ব্রেসের মধ্যে কী-মূল্য জোড় গোষ্ঠীবদ্ধ করা হয়। - অ্যারেস:
[]ব্রাকেটের মধ্যে বিভিন্ন মানের তালিকা থাকে।
উদাহরণ:
{
"name": "Alice",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science"],
"address": {
"street": "123 Main St",
"city": "Somewhere"
}
}
২. JSON এর মৌলিক উপাদানসমূহ
কি-মূল্য জোড়:
- JSON অবজেক্টের মধ্যে কী (string) এবং এর সাথে যুক্ত মান (value) থাকে। মানটি হতে পারে string, number, object, array, boolean, অথবা null।
মান:
- JSON-এ বিভিন্ন ধরনের মান থাকতে পারে:
- String:
"Hello" - Number:
25 - Boolean:
trueবাfalse - Array:
[1, 2, 3] - Object:
{"key": "value"} - Null:
null
- String:
অবজেক্ট:
- JSON অবজেক্ট হল কী-মূল্য জোড়ের একটি সেট, যা
{}এর মধ্যে রাখা হয়।
অ্যারেস:
- JSON অ্যারে হল বিভিন্ন মানের একটি তালিকা, যা
[]এর মধ্যে রাখা হয়।
৩. JSON এর সুবিধা
- মানবপঠনযোগ্য: JSON ফরম্যাট সহজ এবং স্পষ্ট, তাই এটি মানুষ দ্বারা পড়া এবং বুঝতে সহজ।
- লাইটওয়েট: JSON কমপ্যাক্ট ফরম্যাটের জন্য ডেটা স্থানান্তরে কম ব্যান্ডউইথ ব্যবহার করে।
- ক্রস-ল্যাঙ্গুয়েজ: JSON বিভিন্ন প্রোগ্রামিং ভাষায় সমর্থিত এবং এটি বিভিন্ন সিস্টেমের মধ্যে ডেটা বিনিময়ের জন্য আদর্শ।
- সহজ ব্যবহারের জন্য লাইব্রেরি: বেশিরভাগ ভাষায় JSON ডেটা প্রসেসিংয়ের জন্য লাইব্রেরি পাওয়া যায়, যা JSON ডেটা তৈরি, পড়া এবং রূপান্তর করা সহজ করে।
৪. JSON এর ব্যবহার
- API Communication: JSON সাধারণত RESTful APIs এর মাধ্যমে সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা বিনিময়ের জন্য ব্যবহৃত হয়।
- Configuration Files: অনেক সফটওয়্যার এবং অ্যাপ্লিকেশন তাদের কনফিগারেশন সেটিংস JSON ফরম্যাটে সংরক্ষণ করে।
- Data Storage: ডেটাবেসের বাইরে তথ্য সংরক্ষণ করার জন্য JSON একটি জনপ্রিয় ফরম্যাট।
উপসংহার
JSON একটি শক্তিশালী এবং জনপ্রিয় ডেটা বিন্যাস, যা তথ্য বিনিময় এবং পরিচালনার জন্য একটি সহজ এবং কার্যকরী উপায়। এর মানবপঠনযোগ্যতা, লাইটওয়েট ফরম্যাট এবং ক্রস-ল্যাঙ্গুয়েজ সমর্থন এটি আধুনিক সফটওয়্যার উন্নয়নে অপরিহার্য করে তোলে।
Dart এ JSON Encode এবং Decode করা
Dart-এ JSON ডেটা পরিচালনা করার জন্য dart:convert লাইব্রেরি ব্যবহার করা হয়। JSON ডেটা কার্যকরভাবে সিরিয়ালাইজ (Encode) এবং ডেসিরিয়ালাইজ (Decode) করার জন্য Dart-এ jsonEncode এবং jsonDecode ফাংশনগুলি প্রদান করা হয়।
১. JSON Encode (সিরিয়ালাইজেশন)
JSON Encode একটি অবজেক্ট (যেমন Map বা List) কে JSON স্ট্রিংয়ে রূপান্তর করার প্রক্রিয়া। Dart-এ jsonEncode ফাংশন ব্যবহার করে এটি করা হয়।
উদাহরণ: JSON Encode করা
import 'dart:convert';
void main() {
// Create a Map representing a user
Map<String, dynamic> user = {
'name': 'Alice',
'age': 30,
'isStudent': false,
'courses': ['Math', 'Science'],
};
// Serialize the Map to JSON
String jsonString = jsonEncode(user);
print(jsonString); // Output: {"name":"Alice","age":30,"isStudent":false,"courses":["Math","Science"]}
}
২. JSON Decode (ডেসিরিয়ালাইজেশন)
JSON Decode একটি JSON স্ট্রিংকে Dart অবজেক্টে (যেমন Map বা List) রূপান্তর করার প্রক্রিয়া। Dart-এ jsonDecode ফাংশন ব্যবহার করে এটি করা হয়।
উদাহরণ: JSON Decode করা
import 'dart:convert';
void main() {
String jsonString = '{"name":"Alice","age":30,"isStudent":false,"courses":["Math","Science"]}';
// Deserialize the JSON string to a Map
Map<String, dynamic> user = jsonDecode(jsonString);
print('Name: ${user['name']}'); // Output: Name: Alice
print('Age: ${user['age']}'); // Output: Age: 30
print('Is Student: ${user['isStudent']}'); // Output: Is Student: false
print('Courses: ${user['courses']}'); // Output: Courses: [Math, Science]
}
৩. কাস্টম ক্লাসের জন্য Encode এবং Decode
আপনি যদি কাস্টম ক্লাস ব্যবহার করতে চান, তবে সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করতে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।
উদাহরণ: কাস্টম ক্লাসের জন্য সিরিয়ালাইজেশন
class User {
String name;
int age;
bool isStudent;
List<String> courses;
User({required this.name, required this.age, required this.isStudent, required this.courses});
// Serialize User to JSON
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'isStudent': isStudent,
'courses': courses,
};
}
// Deserialize JSON to User
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
isStudent: json['isStudent'],
courses: List<String>.from(json['courses']),
);
}
}
void main() {
// Create a User instance
User user = User(name: 'Alice', age: 30, isStudent: false, courses: ['Math', 'Science']);
// Serialize User to JSON
String jsonString = jsonEncode(user.toJson());
print(jsonString); // Output: {"name":"Alice","age":30,"isStudent":false,"courses":["Math","Science"]}
// Deserialize JSON back to User
User newUser = User.fromJson(jsonDecode(jsonString));
print('Name: ${newUser.name}, Age: ${newUser.age}'); // Output: Name: Alice, Age: 30
}
উপসংহার
Dart-এ JSON Encode এবং Decode করা একটি সহজ প্রক্রিয়া। dart:convert লাইব্রেরির মাধ্যমে, আপনি অবজেক্টগুলিকে JSON স্ট্রিংয়ে সিরিয়ালাইজ এবং JSON স্ট্রিং থেকে অবজেক্টে ডেসিরিয়ালাইজ করতে পারেন। এই বৈশিষ্ট্যগুলি ডেভেলপারদের জন্য তাদের অ্যাপ্লিকেশনগুলির মধ্যে তথ্য বিনিময়ের ক্ষমতা বৃদ্ধি করে।
Model Class তৈরি এবং Serialization in Dart
Dart-এ একটি Model Class তৈরি করা এবং সেটিকে Serialization (অবজেক্টকে JSON ফরম্যাটে রূপান্তর করা) একটি সাধারণ প্রক্রিয়া। এটি সাধারণত API থেকে ডেটা মডেল করার জন্য ব্যবহৃত হয়। নিচে Model Class তৈরি এবং Serialization করার প্রক্রিয়া বিস্তারিতভাবে আলোচনা করা হলো।
১. Model Class তৈরি
Model Class হল একটি ক্লাস যা আপনার অ্যাপ্লিকেশনের ডেটা মডেলকে প্রতিনিধিত্ব করে। উদাহরণস্বরূপ, যদি আপনি একটি ব্যবহারকারী (User) মডেল তৈরি করতে চান, তাহলে ক্লাসটি দেখতে এরকম হবে:
class User {
String name;
int age;
bool isStudent;
List<String> courses;
User({
required this.name,
required this.age,
required this.isStudent,
required this.courses,
});
// Serialize User to JSON
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'isStudent': isStudent,
'courses': courses,
};
}
// Deserialize JSON to User
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
isStudent: json['isStudent'],
courses: List<String>.from(json['courses']),
);
}
}
২. Serialization (JSON এ রূপান্তর)
Serialization হল Model Class-এর একটি অবজেক্টকে JSON ফরম্যাটে রূপান্তর করার প্রক্রিয়া। এই উদাহরণে, toJson মেথডটি ব্যবহার করা হয়েছে।
উদাহরণ: Serialization
import 'dart:convert';
void main() {
// Create a User instance
User user = User(
name: 'Alice',
age: 30,
isStudent: false,
courses: ['Math', 'Science'],
);
// Serialize User to JSON
String jsonString = jsonEncode(user.toJson());
print('Serialized JSON: $jsonString');
}
৩. Deserialization (JSON থেকে পুনরুদ্ধার)
Deserialization হল JSON ফরম্যাটের একটি স্ট্রিংকে Model Class এর একটি অবজেক্টে রূপান্তর করার প্রক্রিয়া। এই উদাহরণে, fromJson ফ্যাক্টরি কনস্ট্রাক্টর ব্যবহার করা হয়েছে।
উদাহরণ: Deserialization
void main() {
String jsonString = '{"name":"Alice","age":30,"isStudent":false,"courses":["Math","Science"]}';
// Deserialize JSON to User
User user = User.fromJson(jsonDecode(jsonString));
print('Deserialized User: ${user.name}, Age: ${user.age}, Is Student: ${user.isStudent}');
}
৪. সম্পূর্ণ উদাহরণ
একসাথে সবকিছু দেখানো:
import 'dart:convert';
// Model class
class User {
String name;
int age;
bool isStudent;
List<String> courses;
User({
required this.name,
required this.age,
required this.isStudent,
required this.courses,
});
// Serialize User to JSON
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'isStudent': isStudent,
'courses': courses,
};
}
// Deserialize JSON to User
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
isStudent: json['isStudent'],
courses: List<String>.from(json['courses']),
);
}
}
void main() {
// Create a User instance
User user = User(
name: 'Alice',
age: 30,
isStudent: false,
courses: ['Math', 'Science'],
);
// Serialize User to JSON
String jsonString = jsonEncode(user.toJson());
print('Serialized JSON: $jsonString');
// Deserialize JSON to User
User newUser = User.fromJson(jsonDecode(jsonString));
print('Deserialized User: ${newUser.name}, Age: ${newUser.age}, Is Student: ${newUser.isStudent}');
}
উপসংহার
Dart-এ Model Class তৈরি করা এবং Serialization একটি কার্যকরী প্রক্রিয়া যা API থেকে ডেটা পরিচালনার জন্য সহায়ক। toJson এবং fromJson মেথডগুলি ব্যবহার করে আপনি অবজেক্টগুলিকে JSON এ রূপান্তর করতে এবং JSON থেকে অবজেক্টে রূপান্তর করতে পারেন। এটি ডেটা বিনিময়ের সময় নিরাপত্তা এবং কার্যকারিতা বৃদ্ধি করে।
জটিল অবজেক্ট সিরিয়ালাইজেশন প্রযুক্তি (Complex Object Serialization Techniques) in Dart
Dart-এ জটিল অবজেক্টগুলি যেমন নেস্টেড অবজেক্ট বা লিস্ট সম্বলিত অবজেক্টের সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রক্রিয়া করার জন্য কিছু প্রযুক্তি প্রয়োজন। এখানে জটিল অবজেক্ট সিরিয়ালাইজেশন করার জন্য বিভিন্ন কৌশল আলোচনা করা হলো।
১. নেস্টেড অবজেক্ট সিরিয়ালাইজেশন
যখন একটি অবজেক্টে অন্য অবজেক্ট থাকে (নেস্টেড স্ট্রাকচার), তখন প্রতিটি ক্লাসের জন্য সিরিয়ালাইজেশন মেথড তৈরি করতে হবে।
উদাহরণ: নেস্টেড অবজেক্ট সিরিয়ালাইজেশন
import 'dart:convert';
// Address ক্লাস
class Address {
String street;
String city;
Address({required this.street, required this.city});
Map<String, dynamic> toJson() {
return {
'street': street,
'city': city,
};
}
factory Address.fromJson(Map<String, dynamic> json) {
return Address(
street: json['street'],
city: json['city'],
);
}
}
// User ক্লাস
class User {
String name;
int age;
Address address; // নেস্টেড অবজেক্ট
User({required this.name, required this.age, required this.address});
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'address': address.toJson(), // নেস্টেড অবজেক্টকে সিরিয়ালাইজ করা
};
}
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
address: Address.fromJson(json['address']), // নেস্টেড অবজেক্টকে ডেসিরিয়ালাইজ করা
);
}
}
void main() {
// User অবজেক্ট তৈরি
User user = User(
name: 'Alice',
age: 30,
address: Address(street: '123 Main St', city: 'Somewhere'),
);
// অবজেক্টকে JSON-এ রূপান্তর করা
String jsonString = jsonEncode(user.toJson());
print('Serialized JSON: $jsonString');
// JSON থেকে অবজেক্টে রূপান্তর করা
User newUser = User.fromJson(jsonDecode(jsonString));
print('Name: ${newUser.name}, Age: ${newUser.age}, Street: ${newUser.address.street}');
}
২. অবজেক্টের তালিকা সিরিয়ালাইজেশন
যখন অবজেক্টের তালিকা থাকে, তখন তালিকাটিকে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার জন্য মেথড তৈরি করতে হবে।
উদাহরণ: অবজেক্টের তালিকা সিরিয়ালাইজেশন
class Course {
String title;
int credits;
Course({required this.title, required this.credits});
Map<String, dynamic> toJson() {
return {
'title': title,
'credits': credits,
};
}
factory Course.fromJson(Map<String, dynamic> json) {
return Course(
title: json['title'],
credits: json['credits'],
);
}
}
class Student {
String name;
List<Course> courses; // অবজেক্টের তালিকা
Student({required this.name, required this.courses});
Map<String, dynamic> toJson() {
return {
'name': name,
'courses': courses.map((course) => course.toJson()).toList(), // তালিকাকে সিরিয়ালাইজ করা
};
}
factory Student.fromJson(Map<String, dynamic> json) {
return Student(
name: json['name'],
courses: (json['courses'] as List)
.map((courseJson) => Course.fromJson(courseJson))
.toList(), // তালিকাকে ডেসিরিয়ালাইজ করা
);
}
}
void main() {
// Student অবজেক্ট তৈরি
Student student = Student(
name: 'Bob',
courses: [
Course(title: 'Math', credits: 3),
Course(title: 'Science', credits: 4),
],
);
// অবজেক্টকে JSON-এ রূপান্তর করা
String jsonString = jsonEncode(student.toJson());
print('Serialized JSON: $jsonString');
// JSON থেকে অবজেক্টে রূপান্তর করা
Student newStudent = Student.fromJson(jsonDecode(jsonString));
print('Deserialized Student: ${newStudent.name}, Courses: ${newStudent.courses.map((course) => course.title).toList()}');
}
৩. ঐচ্ছিক ফিল্ডগুলি পরিচালনা করা
যখন আপনার মডেল ক্লাসে ঐচ্ছিক ফিল্ড থাকে, তখন সেগুলি সঠিকভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে হবে।
উদাহরণ: ঐচ্ছিক ফিল্ড
class User {
String name;
int age;
String? email; // ঐচ্ছিক ফিল্ড
User({required this.name, required this.age, this.email});
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'email': email, // শুধুমাত্র যদি null না হয়
};
}
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
email: json['email'], // ঐচ্ছিক ফিল্ডের জন্য
);
}
}
৪. কাস্টম সিরিয়ালাইজেশন লজিক
যদি আপনাকে জটিল ডেটা টাইপের জন্য কাস্টম সিরিয়ালাইজেশন লজিক তৈরি করতে হয়, তখন এটি করতে পারেন।
উদাহরণ: কাস্টম সিরিয়ালাইজেশন লজিক
class User {
String name;
int age;
List<int> scores;
User({required this.name, required this.age, required this.scores});
// কাস্টম সিরিয়ালাইজেশন লজিক
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'scores': scores.join(','), // তালিকাকে কমা দ্বারা পৃথক স্ট্রিংয়ে রূপান্তর করা
};
}
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
scores: (json['scores'] as String).split(',').map(int.parse).toList(), // তালিকাকে পুনরুদ্ধার করা
);
}
}
উপসংহার
Dart-এ জটিল অবজেক্ট সিরিয়ালাইজেশন প্রযুক্তিগুলি কার্যকরী এবং নমনীয়। ক্লাসের উপযুক্ত সিরিয়ালাইজেশন মেথডগুলি সংজ্ঞায়িত করে, আপনি সহজেই অবজেক্টগুলিকে JSON ফরম্যাটে রূপান্তর এবং পুনরুদ্ধার করতে পারেন। এটি API-এর সাথে কাজ করার সময় ডেটা বিনিময়ের জন্য অত্যন্ত সহায়ক।
Read more