Flutter数据模型转换插件model_json的使用

Flutter数据模型转换插件model_json的使用

本插件帮助你管理数据库对象模型。

开始使用

定义一些数据库对象,例如 User,继承自 Equatable 并混入 Model

class User extends Equatable with Model {
  final String id;
  final String name;
  final List<String> list;

  User({
    required this.id,
    required this.name,
    required this.list,
  });

  @override
  List<Object?> get props => [id, name, list];
}

由于Dart语言的限制,特别是不能使用从变量派生的类型作为泛型参数,model_json依赖于type_plus。为了使用model_json,你需要将你的类添加到type_plus的类定义中,如下所示:

void main() {
  . . .
  TypePlus.add<User>();
  . . .
}

你可以将这个过程移到一个单独的函数中,如果你有很多类。

使用

从JSON解析

假设我们发送了一个请求 GET /user?id=,响应体包含一个用户对象的JSON。我们可以解析它:

import 'package:http/http.dart' as http;
import 'package:model_json/model_json.dart';
import 'package:type_plus/type_plus.dart';

void main() async {
  TypePlus.add<User>();

  final client = http.Client();
  final uri = Uri.http(
      "localhost:5000",
      "/user",
      queryParameters: {"id": "awd3512gf"},
  );
  final response = await client.get(uri);

  final user = Model.fromJson<User>(response.body);
  
  print(user.id); // 输出用户ID
  print(user.name); // 输出用户名
  print(user.list); // 输出用户列表
}

将对象转换为JSON

所有混入Model的类都有toJson方法。假设我们要通过请求 POST /user?id=&name=&list= 保存一个用户对象:

import 'package:http/http.dart' as http;
import 'package:model_json/model_json.dart';
import 'package:type_plus/type_plus.dart';

void main() async {
  TypePlus.add<User>();

  final user = User(
    id: 'awd3512gf',
    name: 'John Doe',
    list: ['hello', 'world'],
  );

  final client = http.Client();
  final uri = Uri.http(
      "localhost:5000",
      "/user",
      queryParameters: user.toJson(),
  );
  final response = await client.post(uri);

  print(response.statusCode); // 输出响应状态码
  print(response.body); // 输出响应体
}

对象比较

User 继承了 Equatable,并且 Model 实现了 props 方法。因此 User 对象现在可以按值进行比较。

final test1 = User(id: '1', name: 'john doe', list: ['hello', 'world']);
final test2 = User(id: '1', name: 'john doe', list: ['hello', 'world']);

print(test1 == test2); // 输出true

更多关于Flutter数据模型转换插件model_json的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据模型转换插件model_json的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


model_json 是一个用于在 Flutter 中进行数据模型转换的插件,它可以帮助你将 JSON 数据与 Dart 数据模型之间进行相互转换。使用 model_json 插件,你可以轻松地将 JSON 数据映射到 Dart 对象,或者将 Dart 对象序列化为 JSON 数据。

安装 model_json 插件

首先,你需要在 pubspec.yaml 文件中添加 model_json 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  model_json: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

使用 model_json 插件

1. 定义数据模型

假设你有一个 JSON 数据如下:

{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com"
}

你可以定义一个对应的 Dart 数据模型:

import 'package:model_json/model_json.dart';

class User with ModelJson<User> {
  int? id;
  String? name;
  String? email;

  User({this.id, this.name, this.email});

  [@override](/user/override)
  User fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
      email: json['email'],
    );
  }

  [@override](/user/override)
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'email': email,
    };
  }
}

2. 从 JSON 转换到 Dart 对象

你可以使用 fromJson 方法将 JSON 数据转换为 Dart 对象:

void main() {
  String jsonString = '''
  {
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@example.com"
  }
  ''';

  Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  User user = User().fromJson(jsonMap);

  print('User ID: ${user.id}');
  print('User Name: ${user.name}');
  print('User Email: ${user.email}');
}

3. 从 Dart 对象转换到 JSON

你可以使用 toJson 方法将 Dart 对象转换为 JSON 数据:

void main() {
  User user = User(id: 1, name: "John Doe", email: "john.doe@example.com");

  Map<String, dynamic> jsonMap = user.toJson();
  String jsonString = jsonEncode(jsonMap);

  print('JSON String: $jsonString');
}

嵌套对象的处理

如果你的 JSON 数据中包含嵌套对象,你也可以在 fromJsontoJson 方法中进行处理。例如:

class Address with ModelJson<Address> {
  String? city;
  String? country;

  Address({this.city, this.country});

  [@override](/user/override)
  Address fromJson(Map<String, dynamic> json) {
    return Address(
      city: json['city'],
      country: json['country'],
    );
  }

  [@override](/user/override)
  Map<String, dynamic> toJson() {
    return {
      'city': city,
      'country': country,
    };
  }
}

class User with ModelJson<User> {
  int? id;
  String? name;
  String? email;
  Address? address;

  User({this.id, this.name, this.email, this.address});

  [@override](/user/override)
  User fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
      email: json['email'],
      address: json['address'] != null ? Address().fromJson(json['address']) : null,
    );
  }

  [@override](/user/override)
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'email': email,
      'address': address?.toJson(),
    };
  }
}
回到顶部