Flutter分析Json最好用的工具

藏宝库编辑 2024-9-27 11:47:51 59 0 来自 中国
相信做Flutter开辟的小同伴们曾经都有如许的痛楚,接口明显是联调OK的,怎么提测以后接口就出题目了,有一种环境是如许的,配景哥们很不负责任的调解了字段范例,大概修改了字段名,再大概缺少了原有返回的字段。
起首看下,相信各人正常都是如许分析json的
//假如已经获取到了从配景的responseMap<String, dynamic> json =  [];//分析String值与int值String nickname = json["nickname"];int userId = json["userId"];这种写法,假如配景没有返回nickname字段,大概userId配景返回的是字符串范例,这里json分析就会报错,flutter不像原生分析一样有json.optString大概json.optInt如许的方法,固然在flutter中map也有containsKey方法,判断该字段是否存在,岂非.....我要对每个字段举行判断吗?假如非要我如许做,我会把配景杀了。
有没有什么方法可以像原生Android一样分析,直接json.optString()一样处理处罚,实时配景没有返回该字段,大概数据范例对不上,app这边依然可以正常运行,不会步调报错,答案是有的,那就是extension method处理处罚,实现map的扩展函数(getString,getInt,getBool)如许的方法,然后在内里自己举行容错处理处罚即可)java是不能实现扩展函数的,kotlin与flutter却可以,废话不多说,直接上代码吧。
/** * 扩展工具类 */extension ExtensionUtils on Map {  /**   * 返回一个int值   */  int getInt(String key, {int defValue = 0}) {    try {      if (containsKey(key)) {        var value = this[key];        if (null == value) {          return defValue;        } else if (value is String) {          return int.parse(value);        }        return value;      }    } on Exception {    } catch (e) {}    return defValue;  }  /**   * 返回一个String值   */  String getString(String key, {String defValue = ""}) {    try {      if (containsKey(key)) {        var value = this[key];        if (null == value) {          return defValue;        } else if (value is int) {          return value.toString();        }        return this[key];      }    } on Exception {    } catch (e) {}    return defValue;  }  /**   * 返回一个map   */  Map<String, dynamic> getMap(String key) {    try {      if (containsKey(key)) {        return this[key];      }    } on Exception {    } catch (e) {}    return {};  }  /**   * 返回一个对象   */  T getObject<T>(String key, T Function(Map<String, dynamic>) parseModel) {    try {      if (this.containsKey(key) && null != this[key]) {        return parseModel(this[key]);      } else {        return parseModel({});      }    } on Exception {      return parseModel({});    }  }  /**   * 分析list   */  List<T> getList<T>(String key, T Function(dynamic data) parseModel) {    try {      List list = this[key] ?? [];      List<T> datas = list.map((e) => parseModel(e)).toList();      return datas;    } on Exception {      return [];    }  }}末了看下我是怎样调用的
分析int,String
import 'package:app_flutter/utils/extensions_utils.dart';class Shift {  String? endTime;  int? groupId;  String? workStatus; //WORKING:值班中, RESTING:苏息中,HANDOVER_WORK: 交班, RECEIVING_WORK: 交班  String? workStatusDesc;  Shift.fromJson(Map<String, dynamic> json) {    endTime = json.getString("endTime");    groupId = json.getInt("groupId");    workStatus = json.getString("workStatus");    workStatusDesc = json.getString("workStatusDesc");  }}分析object对象与分析list数组
import 'package:app_flutter/utils/extensions_utils.dart';import 'message_ext.dart';/** * 未读消息体 */class MessageNotify {  late String content;//    内容  string  late MessageExt ext;//    扩展数据    object  late String id;// id  string  late int isRead;//    是否已读(0:否,1:是)   integer  late String msgId;//  消息id    integer  late String recId;//  吸收者id   string  late List<String> tags;// 标签数组    array   string  late String time;//   时间  string  late String title;//  标题  MessageNotify.from(Map<String, dynamic> map){    content = map.getString("content");    ext = map.getObject("ext", (data){ return MessageExt.from(data);});    id = map.getString("id");    isRead = map.getInt("isRead");    msgId = map.getString("msgId");    recId = map.getString("recId");    tags = map.getList("tags", (item){return item.toString();});    time = map.getString("time");    title = map.getString("title");  }}增补下MessageExt.dart类
import 'package:app_flutter/constant/asset_path_constant.dart';import 'package:app_flutter/utils/extensions_utils.dart';/** * 未读消息-扩展字段 */class MessageExt {  late int msgType; //: 0变乱,1待办,2逾期,3临期  late String typeId; //: 变乱ID或工单ID  late String businessId;// 业务ID,当type为 3,4的时间,该字段有值  late int type; //: 0告警变乱,1报修变乱,2告警工单,3保养工单,4巡检工单,5维修工单  late String msgTip; //:严峻,巡检,维保,告警处理  late String msgIcon; //: 图标路径  MessageExt.from(Map<String, dynamic> map) {    msgType = map.getInt("msgType");    typeId = map.getString("typeId");    type = map.getInt("type");    msgTip = map.getString("msgTip");    msgIcon = map.getString("msgIcon");    businessId = map.getString("businessId");  }}此工具类一出,方便了组内的其他小同伴,老大直接给我call了波666,其时搞的我都飘了。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 20:32, Processed in 0.136331 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表