1.配置好环境
参考文章
参考文章
配置好环境后记得重启,效果是能在Android Studio的Terminal中输入Flutter后有相应的提示
2.添加依赖
在pubspec.yaml文件中主要添加以下
json_annotation: ^4.4.0
json_serializable: ^6.1.0
build_runner: ^2.1.8
我的依赖文件如下,格式要注意,版本号太低会导致解析出错,可以用我的版本号
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: ^1.0.2
english_words: ^3.1.0
dio: ^4.0.4
json_annotation: ^4.4.0
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^1.0.0
json_serializable: ^6.1.0
build_runner: ^2.1.8
3.开始解析数据
参考文章
参考文章
json_serializable 自动生成工具:
工具链接
4.创建dart文件:one_click.dart 然后粘贴解析到的数据进去,有报错不用管
5.在Terminal中输入flutter packages pub run build_runner build会在同一个目录下自动生成一个one_click.g.dart
参考文章
这个命令会生成一次当前的所有被标记的注解的对应的文件。
flutter packages pub run build_runner build
这个命令会持续的监听所有被注解标记的文件并生成对应的文件。
flutter packages pub run build_runner watch
6.使用
@override
void initState() {
// TODO: implement initState
super.initState();
this._getData();//在组件状态的初始化中调用网络请求
}
_getData() async {
var apiUrl = "http://mltest.mila.chat/api/v2/public/oneClickLogin";
Map map = Map();//参数
DateTime now = new DateTime.now();
String sign = "123456" + "andr1" + "981295955" + "meet";
map["type"]="5";
map["source"]="android";
Response result = await Dio()
.post(apiUrl,data: map, options:Options (headers: {
"XX-Device-Type":"android",
"channel":"Music",
"ML-Sign": sign}));//通过options添加头请求
//数据解析
Map<String,dynamic> userMap = json.decode(result.toString());
var user = one_click.fromJson(userMap);
//输出
print(user.data.rcKey);
setState(() {
print(user.data.user.birthday);
});
}
命名一定要规范
OneClick.dart
import 'package:json_annotation/json_annotation.dart';
part 'OneClick.g.dart';
@JsonSerializable()
class OneClick extends Object {
@JsonKey(name: 'code')
int code;
@JsonKey(name: 'msg')
String msg;
@JsonKey(name: 'data')
Data data;
OneClick(this.code,this.msg,this.data,);
factory OneClick.fromJson(Map<String, dynamic> srcJson) => _$OneClickFromJson(srcJson);
Map<String, dynamic> toJson() => _$OneClickToJson(this);
}
@JsonSerializable()
class Data extends Object {
@JsonKey(name: 'token')
String token;
@JsonKey(name: 'rc_key')
String rcKey;
@JsonKey(name: 'rc_token')
String rcToken;
@JsonKey(name: 'user')
User user;
Data(this.token,this.rcKey,this.rcToken,this.user,);
factory Data.fromJson(Map<String, dynamic> srcJson) => _$DataFromJson(srcJson);
Map<String, dynamic> toJson() => _$DataToJson(this);
}
@JsonSerializable()
class User extends Object {
@JsonKey(name: 'id')
int id;
@JsonKey(name: 'user_nickname')
String userNickname;
@JsonKey(name: 'sex')
int sex;
@JsonKey(name: 'birthday')
int birthday;
@JsonKey(name: 'height')
int height;
@JsonKey(name: 'occupation')
String occupation;
@JsonKey(name: 'emotion')
int emotion;
@JsonKey(name: 'is_accept_date')
int isAcceptDate;
@JsonKey(name: 'labelid')
String labelid;
@JsonKey(name: 'label')
String label;
@JsonKey(name: 'label_c')
String labelC;
@JsonKey(name: 'weight')
int weight;
@JsonKey(name: 'user_login')
String userLogin;
@JsonKey(name: 'avatar')
String avatar;
@JsonKey(name: 'avatar_thumb')
String avatarThumb;
@JsonKey(name: 'signature')
String signature;
@JsonKey(name: 'coin')
int coin;
@JsonKey(name: 'consumption')
int consumption;
@JsonKey(name: 'votes')
int votes;
@JsonKey(name: 'votestotal')
int votestotal;
@JsonKey(name: 'level_anchor')
String levelAnchor;
@JsonKey(name: 'online')
int online;
@JsonKey(name: 'isvoice')
int isvoice;
@JsonKey(name: 'voice_value')
int voiceValue;
@JsonKey(name: 'isvideo')
int isvideo;
@JsonKey(name: 'video_value')
int videoValue;
@JsonKey(name: 'user_status')
int userStatus;
@JsonKey(name: 'login_type')
int loginType;
@JsonKey(name: 'last_login_time')
int lastLoginTime;
@JsonKey(name: 'goodnums')
int goodnums;
@JsonKey(name: 'badnums')
int badnums;
@JsonKey(name: 'isauth')
int isauth;
@JsonKey(name: 'province')
String province;
@JsonKey(name: 'city')
String city;
@JsonKey(name: 'district')
String district;
@JsonKey(name: 'is_login_edit')
int isLoginEdit;
@JsonKey(name: 'iso_code')
String isoCode;
@JsonKey(name: 'level')
String level;
@JsonKey(name: 'line')
String line;
@JsonKey(name: 'line_value')
int lineValue;
User(this.id,this.userNickname,this.sex,this.birthday,this.height,this.occupation,this.emotion,this.isAcceptDate,this.labelid,this.label,this.labelC,this.weight,this.userLogin,this.avatar,this.avatarThumb,this.signature,this.coin,this.consumption,this.votes,this.votestotal,this.levelAnchor,this.online,this.isvoice,this.voiceValue,this.isvideo,this.videoValue,this.userStatus,this.loginType,this.lastLoginTime,this.goodnums,this.badnums,this.isauth,this.province,this.city,this.district,this.isLoginEdit,this.isoCode,this.level,this.line,this.lineValue,);
factory User.fromJson(Map<String, dynamic> srcJson) => _$UserFromJson(srcJson);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
OneClick.g.dart
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'OneClick.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
OneClick _$OneClickFromJson(Map<String, dynamic> json) => OneClick(
json['code'] as int,
json['msg'] as String,
Data.fromJson(json['data'] as Map<String, dynamic>),
);
Map<String, dynamic> _$OneClickToJson(OneClick instance) => <String, dynamic>{
'code': instance.code,
'msg': instance.msg,
'data': instance.data,
};
Data _$DataFromJson(Map<String, dynamic> json) => Data(
json['token'] as String,
json['rc_key'] as String,
json['rc_token'] as String,
User.fromJson(json['user'] as Map<String, dynamic>),
);
Map<String, dynamic> _$DataToJson(Data instance) => <String, dynamic>{
'token': instance.token,
'rc_key': instance.rcKey,
'rc_token': instance.rcToken,
'user': instance.user,
};
User _$UserFromJson(Map<String, dynamic> json) => User(
json['id'] as int,
json['user_nickname'] as String,
json['sex'] as int,
json['birthday'] as int,
json['height'] as int,
json['occupation'] as String,
json['emotion'] as int,
json['is_accept_date'] as int,
json['labelid'] as String,
json['label'] as String,
json['label_c'] as String,
json['weight'] as int,
json['user_login'] as String,
json['avatar'] as String,
json['avatar_thumb'] as String,
json['signature'] as String,
json['coin'] as int,
json['consumption'] as int,
json['votes'] as int,
json['votestotal'] as int,
json['level_anchor'] as String,
json['online'] as int,
json['isvoice'] as int,
json['voice_value'] as int,
json['isvideo'] as int,
json['video_value'] as int,
json['user_status'] as int,
json['login_type'] as int,
json['last_login_time'] as int,
json['goodnums'] as int,
json['badnums'] as int,
json['isauth'] as int,
json['province'] as String,
json['city'] as String,
json['district'] as String,
json['is_login_edit'] as int,
json['iso_code'] as String,
json['level'] as String,
json['line'] as String,
json['line_value'] as int,
);
Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
'id': instance.id,
'user_nickname': instance.userNickname,
'sex': instance.sex,
'birthday': instance.birthday,
'height': instance.height,
'occupation': instance.occupation,
'emotion': instance.emotion,
'is_accept_date': instance.isAcceptDate,
'labelid': instance.labelid,
'label': instance.label,
'label_c': instance.labelC,
'weight': instance.weight,
'user_login': instance.userLogin,
'avatar': instance.avatar,
'avatar_thumb': instance.avatarThumb,
'signature': instance.signature,
'coin': instance.coin,
'consumption': instance.consumption,
'votes': instance.votes,
'votestotal': instance.votestotal,
'level_anchor': instance.levelAnchor,
'online': instance.online,
'isvoice': instance.isvoice,
'voice_value': instance.voiceValue,
'isvideo': instance.isvideo,
'video_value': instance.videoValue,
'user_status': instance.userStatus,
'login_type': instance.loginType,
'last_login_time': instance.lastLoginTime,
'goodnums': instance.goodnums,
'badnums': instance.badnums,
'isauth': instance.isauth,
'province': instance.province,
'city': instance.city,
'district': instance.district,
'is_login_edit': instance.isLoginEdit,
'iso_code': instance.isoCode,
'level': instance.level,
'line': instance.line,
'line_value': instance.lineValue,
};
如果要解析的list字段的名称是list,就会出现类型和名称一样的问题,解析失败,先用原来的数据去解析
然后再在下面这里改名称为list1,是全局改。然后范式的改为list1,list类型的改为list
GetMomentList
import 'package:json_annotation/json_annotation.dart';
part 'GetMomentList.g.dart';
@JsonSerializable()
class GetMomentList extends Object {
@JsonKey(name: 'code')
int code;
@JsonKey(name: 'data')
Data data;
GetMomentList(this.code,this.data,);
factory GetMomentList.fromJson(Map<String, dynamic> srcJson) => _$GetMomentListFromJson(srcJson);
Map<String, dynamic> toJson() => _$GetMomentListToJson(this);
}
@JsonSerializable()
class Data extends Object {
@JsonKey(name: 'list')
List<List1> list;
Data(this.list,);
factory Data.fromJson(Map<String, dynamic> srcJson) => _$DataFromJson(srcJson);
Map<String, dynamic> toJson() => _$DataToJson(this);
}
@JsonSerializable()
class List1 extends Object {
@JsonKey(name: 'moment_info')
Moment_info momentInfo;
@JsonKey(name: 'user_info')
User_info userInfo;
@JsonKey(name: 'comment_list')
List<dynamic> commentList;
@JsonKey(name: 'like_user_list')
List<dynamic> likeUserList;
List1(this.momentInfo,this.userInfo,this.commentList,this.likeUserList,);
factory List1.fromJson(Map<String, dynamic> srcJson) => _$List1FromJson(srcJson);
Map<String, dynamic> toJson() => _$List1ToJson(this);
}
@JsonSerializable()
class Moment_info extends Object {
@JsonKey(name: 'moment_id')
int momentId;
@JsonKey(name: 'app_id')
String appId;
@JsonKey(name: 'user_id')
int userId;
@JsonKey(name: 'text')
String text;
@JsonKey(name: 'link')
String link;
@JsonKey(name: 'video')
String video;
@JsonKey(name: 'song')
String song;
@JsonKey(name: 'song_name')
String songName;
@JsonKey(name: 'artist')
String artist;
@JsonKey(name: 'show_type')
int showType;
@JsonKey(name: 'create_time')
int createTime;
Moment_info(this.momentId,this.appId,this.userId,this.text,this.link,this.video,this.song,this.songName,this.artist,this.showType,this.createTime,);
factory Moment_info.fromJson(Map<String, dynamic> srcJson) => _$Moment_infoFromJson(srcJson);
Map<String, dynamic> toJson() => _$Moment_infoToJson(this);
}
@JsonSerializable()
class User_info extends Object {
@JsonKey(name: 'user_id')
int userId;
@JsonKey(name: 'nickname')
String nickname;
@JsonKey(name: 'sex')
int sex;
@JsonKey(name: 'birthday')
int birthday;
@JsonKey(name: 'area')
String area;
@JsonKey(name: 'sign')
String sign;
@JsonKey(name: 'avatar')
String avatar;
@JsonKey(name: 'avatar_thumb')
String avatarThumb;
User_info(this.userId,this.nickname,this.sex,this.birthday,this.area,this.sign,this.avatar,this.avatarThumb,);
factory User_info.fromJson(Map<String, dynamic> srcJson) => _$User_infoFromJson(srcJson);
Map<String, dynamic> toJson() => _$User_infoToJson(this);
}
GetMomentList.g.dart
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'GetMomentList.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
GetMomentList _$GetMomentListFromJson(Map<String, dynamic> json) {
return GetMomentList(
json['code'] as int,
json['data'] == null
? null
: Data.fromJson(json['data'] as Map<String, dynamic>),
);
}
Map<String, dynamic> _$GetMomentListToJson(GetMomentList instance) =>
<String, dynamic>{
'code': instance.code,
'data': instance.data,
};
Data _$DataFromJson(Map<String, dynamic> json) {
return Data(
(json['list'] as List)
?.map(
(e) => e == null ? null : List1.fromJson(e as Map<String, dynamic>))
?.toList(),
);
}
Map<String, dynamic> _$DataToJson(Data instance) => <String, dynamic>{
'list': instance.list,
};
List1 _$List1FromJson(Map<String, dynamic> json) {
return List1(
json['moment_info'] == null
? null
: Moment_info.fromJson(json['moment_info'] as Map<String, dynamic>),
json['user_info'] == null
? null
: User_info.fromJson(json['user_info'] as Map<String, dynamic>),
json['comment_list'] as List,
json['like_user_list'] as List,
);
}
Map<String, dynamic> _$List1ToJson(List1 instance) => <String, dynamic>{
'moment_info': instance.momentInfo,
'user_info': instance.userInfo,
'comment_list': instance.commentList,
'like_user_list': instance.likeUserList,
};
Moment_info _$Moment_infoFromJson(Map<String, dynamic> json) {
return Moment_info(
json['moment_id'] as int,
json['app_id'] as String,
json['user_id'] as int,
json['text'] as String,
json['link'] as String,
json['video'] as String,
json['song'] as String,
json['song_name'] as String,
json['artist'] as String,
json['show_type'] as int,
json['create_time'] as int,
);
}
Map<String, dynamic> _$Moment_infoToJson(Moment_info instance) =>
<String, dynamic>{
'moment_id': instance.momentId,
'app_id': instance.appId,
'user_id': instance.userId,
'text': instance.text,
'link': instance.link,
'video': instance.video,
'song': instance.song,
'song_name': instance.songName,
'artist': instance.artist,
'show_type': instance.showType,
'create_time': instance.createTime,
};
User_info _$User_infoFromJson(Map<String, dynamic> json) {
return User_info(
json['user_id'] as int,
json['nickname'] as String,
json['sex'] as int,
json['birthday'] as int,
json['area'] as String,
json['sign'] as String,
json['avatar'] as String,
json['avatar_thumb'] as String,
);
}
Map<String, dynamic> _$User_infoToJson(User_info instance) => <String, dynamic>{
'user_id': instance.userId,
'nickname': instance.nickname,
'sex': instance.sex,
'birthday': instance.birthday,
'area': instance.area,
'sign': instance.sign,
'avatar': instance.avatar,
'avatar_thumb': instance.avatarThumb,
};
数据如下
{
"code": 200,
"data": {
"list": [
{
"moment_info": {
"moment_id": 3909103706347932672,
"app_id": "10001",
"user_id": 10003,
"text": "1",
"link": "",
"photos": null,
"video": "",
"song": "",
"song_name": "",
"artist": "",
"show_type": 0,
"create_time": 1650938437
},
"user_info": {
"user_id": 10003,
"nickname": "10025",
"sex": 2,
"birthday": 16,
"area": "台灣-台南市",
"sign": "4364",
"avatar": "https://mycloud-test.hk.ufileos.com/10001/avatar/330865dec7ade716175a4b6c57a67251.png",
"avatar_thumb": "https://mycloud-test.hk.ufileos.com/10001/avatar/330865dec7ade716175a4b6c57a67251.png?iopcmd=thumbnail&type=8&width=200&height=200"
},
"comment_list": [],
"like_user_list": []
}]}}
使用如下
print("${httpRes.msg}和${httpRes.data.list1[1].userId}");