flutter json解析

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}");
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值