Skip to content

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>,不定义模型类

基于 Flutter 官方文档整理