Flutter 使用json解析的坑

552 阅读2分钟

今天写post请求时候,有数据需要需要解析。

当时看的时候post解析很简单,大概是这个样子

输出是:


这样看也就这样,就看下一个功能了。

今天没事准备写个Dome。

先写一个简单的请求:

推荐一下flutter根据返回值生成j实体

javiercbk.github.io/json_to_dar…

这个可以把请求的数据生成实体,很方便。

请求方法如下:

      try {
        Response response = await dio.post(url);
        if (response.statusCode == 200) {
          Global.setdata("phone", namecontroller.text.toString());
          var jsontext = response.data;
          print(jsontext);
          Map<String, dynamic> map = json.decode(jsontext);
          LoginUser user = LoginUser.fromJson(map);
          _updateText(user.message);
        } else {
          print(response.statusCode);
        }
      } catch (exception) {
        print(exception);
      }

执行

[  +12 ms] I/flutter ( 6816): type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'

意思是类型不对,这是我的实体类

class LoginUser {
  int code;
  String message;
  Data data;

  LoginUser({this.code, this.message, this.data});

  LoginUser.fromJson(Map<String, dynamic> json) {
    code = json['code'];
    message = json['message'];
    data = json['data'] != null ? new Data.fromJson(json['data']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['code'] = this.code;
    data['message'] = this.message;
    if (this.data != null) {
      data['data'] = this.data.toJson();
    }
    return data;
  }
}

class Data {
  String versionId;
  String appId;
  String appName;
  String versionCode;
  String url;
  String upContent;
  String fileName;
  String alreadyTest;
  String alreadyUpdate;
  String upVersionId;
  String useragent;
  int upTime;
  String qrcodeUrl;
  int ctime;

  Data(
      {this.versionId,
      this.appId,
      this.appName,
      this.versionCode,
      this.url,
      this.upContent,
      this.fileName,
      this.alreadyTest,
      this.alreadyUpdate,
      this.upVersionId,
      this.useragent,
      this.upTime,
      this.qrcodeUrl,
      this.ctime});

  Data.fromJson(Map<String, dynamic> json) {
    versionId = json['versionId'];
    appId = json['appId'];
    appName = json['appName'];
    versionCode = json['versionCode'];
    url = json['url'];
    upContent = json['upContent'];
    fileName = json['fileName'];
    alreadyTest = json['alreadyTest'];
    alreadyUpdate = json['alreadyUpdate'];
    upVersionId = json['upVersionId'];
    useragent = json['useragent'];
    upTime = json['upTime'];
    qrcodeUrl = json['qrcodeUrl'];
    ctime = json['ctime'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['versionId'] = this.versionId;
    data['appId'] = this.appId;
    data['appName'] = this.appName;
    data['versionCode'] = this.versionCode;
    data['url'] = this.url;
    data['upContent'] = this.upContent;
    data['fileName'] = this.fileName;
    data['alreadyTest'] = this.alreadyTest;
    data['alreadyUpdate'] = this.alreadyUpdate;
    data['upVersionId'] = this.upVersionId;
    data['useragent'] = this.useragent;
    data['upTime'] = this.upTime;
    data['qrcodeUrl'] = this.qrcodeUrl;
    data['ctime'] = this.ctime;
    return data;
  }
}

这种要怎么改,迅速百度,结果是

Map map = new Map<String, dynamic>.from(jsontext);
LoginUser user = LoginUser.fromJson(map);

改成这种就OK了。


flutter已经发布了好久,以前看过一段时间,但都是简单的使用了解就放弃了,这次不行了,不看下份工作不好找呀,人要未雨绸缪。现在使用flutter开发的多了,有问题也很好找到解决方式。

                                                                                                                -菜鸡程序员