老师我有个返回数据序列化的问题请教一下

来源:1-2 课程导学

mid_one

2022-08-08

比如我有个接口没登录返回

{"status": fail, "code": -1, "msg": ""}

登录成功后返回的数据

{
  code: 1,
  msg: 获取成功, 
  data: [
    {id: 18, image_path: http://oss.xxx.cn/16597800501137.jpg, sort: 1, create_time: 2022-07-28 13:15:51, update_time: 2022-08-06 18:00:52, type: 1, url: http://xx.xx.cn}
  ]
}

请求

class SliderDao {
  static get() async {
    SliderRequest request = SliderRequest();

    // request.pathParams = '';
    var token = HiCache.getInstance().get('token');
    print(token);
    if (token != null) {
      request.add('token', token);
      var result = await HiNet.getInstance().fire(request);
      print(result);
      return result;
    } else {
      HiNavigator.getInstance().onJumpTo(RouteStatus.login);
    }

    // return result;
    // if (result['code'] == -1) {
    //   return result;
    // } else if (result['code'] == 1) {
    //   return result;
    // }
    // var convertJson = json.decode(result.toString());
    // return HomeSliderMo.fromJson(result);
    // return convertJson;
  }
}

page

void loadData() async {
    try {
      var result = await SliderDao.get();
      // var result = jsonDecode(res);
      if (result['code'] == 1) {
        setState(() {
          sliderList = result['data'];
        });
      } else {
        showWarnToast(result['msg']);
        HiNavigator.getInstance().onJumpTo(RouteStatus.login);
      }
    } on NeedAuth catch (e) {
      print(e);
      showWarnToast(e.msg);
    } on HiNetError catch (e) {
      print(e);
      showWarnToast(e.msg);
    }
  }

没登录的情况下走到了page的loadData里, 要通过jsonDecode(result)才能获取到code和msg

但是登录成功以后也进入page的loadData里,这时候通过jsonDecode(result)就报错了, 导致我获取不到sliderDao返回的数据

_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'

图片描述

slideModel

class HomeSliderMo {
  int? code;
  String? msg;
  List<Data>? data;

  HomeSliderMo({this.code, this.msg, this.data});

  HomeSliderMo.fromJson(Map<String, dynamic> json) {
    code = json['code'];
    msg = json['msg'];
    if (json['data'] != null) {
      data = <Data>[];
      json['data'].forEach((v) {
        data!.add(new Data.fromJson(v));
      });
    }
  }

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

class Data {
  int? id;
  String? imagePath;
  int? sort;
  String? createTime;
  String? updateTime;
  int? type;
  String? url;

  Data(
      {this.id,
      this.imagePath,
      this.sort,
      this.createTime,
      this.updateTime,
      this.type,
      this.url});

  Data.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    imagePath = json['image_path'];
    sort = json['sort'];
    createTime = json['create_time'];
    updateTime = json['update_time'];
    type = json['type'];
    url = json['url'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['image_path'] = this.imagePath;
    data['sort'] = this.sort;
    data['create_time'] = this.createTime;
    data['update_time'] = this.updateTime;
    data['type'] = this.type;
    data['url'] = this.url;
    return data;
  }
}

这个我该怎么处理呢

写回答

1回答

CrazyCodeBoy

2022-08-09

问题在于这种情况下数据已经从JSON解码成Map<String,dynamic>不需要在使用json.decode()再次对其进行解码了,
可以加下判断if (res is String)  在进行json.decode()操作。
0
0

Flutter高级进阶实战-仿哔哩哔哩-掌握Flutter高阶技能

一次性掌握Flutter高阶技能+商业级复杂项目架构设计与开发方案

1722 学习 · 870 问题

查看课程