前言
在開發(fā)過程中,我們會從服務器請求數(shù)據(jù),然后解析服務器返回的json。在Android開發(fā)中,我們會使用GsonFormat用來生成json對應的model,那么在Flutter中該如何生成對應的model呢?
使用
一、 添加依賴
在pubspec.yaml中添加json_annotation、build_runner、json_serializable相關插件依賴,如下:
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
dio: ^2.1.0-stable-version
json_annotation: ^1.2.0 #json_serializable助手
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^1.0.0 #創(chuàng)建.g.dart
json_serializable: ^1.5.1 #序列化json
然后點擊右上角的packages get
二、 創(chuàng)建model
創(chuàng)建model有兩種方式:
- 網(wǎng)頁工具生成 https://caijinglong.github.io/json2dart/index_ch.html
- 插件生成 https://github.com/liujingtech/IntelliJ-Json2json_serializable
注意:
一般生成的json不會有什么問題,但是如果json中的key為數(shù)字情況則需要手動修改。
json如下:
{
"keys": {
"1": "A",
"2": "B"
}
}
直接生成的model文件:
import 'package:json_annotation/json_annotation.dart';
part 'entity.g.dart';
@JsonSerializable()
class Entity extends Object {
@JsonKey(name: 'keys')
Keys keys;
Entity(this.keys,);
factory Entity.fromJson(Map<String, dynamic> srcJson) => _$EntityFromJson(srcJson);
Map<String, dynamic> toJson() => _$EntityToJson(this);
}
@JsonSerializable()
class Keys extends Object {
@JsonKey(name: '1')
String 1;
@JsonKey(name: '2')
String 2;
Keys(this.1,this.2,);
factory Keys.fromJson(Map<String, dynamic> srcJson) => _$KeysFromJson(srcJson);
Map<String, dynamic> toJson() => _$KeysToJson(this);
}
由于dart中變量名不能為數(shù)字,所有類Keys中的兩個變量都是非法的,所以我們需要手動修改為如下:
import 'package:json_annotation/json_annotation.dart';
part 'entity.g.dart';
@JsonSerializable()
class Entity extends Object {
@JsonKey(name: 'keys')
Keys keys;
Entity(this.keys,);
factory Entity.fromJson(Map<String, dynamic> srcJson) => _$EntityFromJson(srcJson);
Map<String, dynamic> toJson() => _$EntityToJson(this);
}
@JsonSerializable()
class Keys extends Object {
@JsonKey(name: '1')
String $1;
@JsonKey(name: '2')
String $2;
Keys(this.$1,this.$2,);
factory Keys.fromJson(Map<String, dynamic> srcJson) => _$KeysFromJson(srcJson);
Map<String, dynamic> toJson() => _$KeysToJson(this);
}
把變量String 1和String 2改為String $1和String $2,構造函數(shù)Keys(this.1,this.2,);改為Keys(this.$1,this.$2,);,具體叫取什么名字只要符合dart的命名規(guī)范即可。同時別忘了修改構造函數(shù)。
三、創(chuàng)建.g.dart
在項目根目錄下執(zhí)行命令flutter packages pub run build_runner build,執(zhí)行完畢后會在model的同級目錄下創(chuàng)建<model name>.g.dart的文件。