JSON 序列化
Flutter 中处理 JSON 数据的常用方式。
手动序列化
解析 JSON
dart
import 'dart:convert';
String jsonString = '{"name": "Tom", "age": 25, "email": "tom@example.com"}';
// 字符串 → Map
Map<String, dynamic> user = json.decode(jsonString);
print(user['name']); // Tom
// 字符串 → List
String listJson = '[{"name": "Tom"}, {"name": "Jerry"}]';
List<dynamic> users = json.decode(listJson);模型类
dart
class User {
final String name;
final int age;
final String email;
User({required this.name, required this.age, required this.email});
// JSON → 对象
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
email: json['email'],
);
}
// 对象 → JSON
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'email': email,
};
}
}
// 使用
final user = User.fromJson(json.decode(jsonString));
final jsonStr = json.encode(user.toJson());嵌套模型
dart
class Address {
final String city;
final String street;
Address({required this.city, required this.street});
factory Address.fromJson(Map<String, dynamic> json) {
return Address(city: json['city'], street: json['street']);
}
}
class User {
final String name;
final Address address;
User({required this.name, required this.address});
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
address: Address.fromJson(json['address']),
);
}
}代码生成(推荐用于大型项目)
安装
bash
flutter pub add json_annotation json_serializable
flutter pub add dev:build_runner定义模型
dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User {
final String name;
final int age;
final String? email; // 可空字段
User({required this.name, required this.age, this.email});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}生成代码
bash
flutter pub run build_runner build
# 监听变化自动生成
flutter pub run build_runner watch选择建议
- 小型项目 / 简单 JSON → 手动
fromJson/toJson - 大型项目 / 复杂 JSON →
json_serializable代码生成 - 最简单的方式 → 直接用
Map<String, dynamic>,不定义模型类
