JSON Serialization in Flutter
JSON Serialization in Flutter
Introduction
JSON serialization in Flutter involves converting Dart objects to JSON strings (serialization) and JSON data back to Dart objects (deserialization). It is a common approach to exchange data between an application and a backend server or local storage.
Serialization and Deserialization
Serialization: Converts a Dart object into a JSON string.
Deserialization: Parses a JSON string into a Dart object.
Example JSON structure:
{
"id": 1,
"name": "Flutter",
"isAwesome": true
}
Steps for JSON Serialization
1. Define a Dart Class
class Course {
final int id;
final String name;
final bool isAwesome;
Course({required this.id, required this.name, required this.isAwesome});
}
2. Add Serialization and Deserialization Methods
class Course {
final int id;
final String name;
final bool isAwesome;
Course({required this.id, required this.name, required this.isAwesome});
factory Course.fromJson(Map json) {
return Course(
id: json['id'],
name: json['name'],
isAwesome: json['isAwesome'],
);
}
Map toJson() {
return {
'id': id,
'name': name,
'isAwesome': isAwesome,
};
}
}
3. Use the Methods
void main() {
String jsonString = '{"id": 1, "name": "Flutter", "isAwesome": true}';
Map jsonData = jsonDecode(jsonString);
Course course = Course.fromJson(jsonData);
print(course.name); // Output: Flutter
String jsonEncoded = jsonEncode(course.toJson());
print(jsonEncoded); // Output: {"id":1,"name":"Flutter","isAwesome":true}
}
Using json_serializable Package
1. Add Dependencies
dependencies:
json_annotation: ^latest_version
dev_dependencies:
build_runner: ^latest_version
json_serializable: ^latest_version
2. Define the Class
@JsonSerializable()
class Course {
final int id;
final String name;
final bool isAwesome;
Course({required this.id, required this.name, required this.isAwesome});
factory Course.fromJson(Map json) => _$CourseFromJson(json);
Map toJson() => _$CourseToJson(this);
}
3. Generate Code
flutter pub run build_runner build
4. Use the Generated Code
void main() {
String jsonString = '{"id": 1, "name": "Flutter", "isAwesome": true}';
Map jsonData = jsonDecode(jsonString);
Course course = Course.fromJson(jsonData);
print(course.name); // Output: Flutter
String jsonEncoded = jsonEncode(course.toJson());
print(jsonEncoded); // Output: {"id":1,"name":"Flutter","isAwesome":true}
}
Handling Nested JSON
For nested structures, create additional Dart classes and handle them recursively:
Example JSON
{
"id": 1,
"name": "Flutter",
"topics": [
{"id": 101, "title": "Widgets"},
{"id": 102, "title": "State Management"}
]
}
Dart Classes
class Topic {
final int id;
final String title;
Topic({required this.id, required this.title});
factory Topic.fromJson(Map json) => Topic(
id: json['id'],
title: json['title'],
);
Map toJson() => {
'id': id,
'title': title,
};
}
class Course {
final int id;
final String name;
final List topics;
Course({required this.id, required this.name, required this.topics});
factory Course.fromJson(Map json) => Course(
id: json['id'],
name: json['name'],
topics: (json['topics'] as List).map((t) => Topic.fromJson(t)).toList(),
);
Map toJson() => {
'id': id,
'name': name,
'topics': topics.map((t) => t.toJson()).toList(),
};
}
Summary
- Manual serialization is straightforward but repetitive.
- Use
json_serializablefor automated serialization. - Handle nested JSON with recursive Dart class structures.
Efficient JSON serialization ensures smooth communication between Flutter apps and external data sources.
Comments
Post a Comment