Flutter系列JSON解析与复杂模型转换实用技巧

JSON解析与复杂模型转换实用技巧

  • 应该是有那种JSON序列化方式?
  • 如何序列化?
  • 复杂JSON解析?
  • 提升效率:在线转换JSON TO Dart?

JSON是一种轻量级的数据交换语言,在网络编程中大量的用到了JSON来作为传输数据的格式,那么在Flutter中是如何处理JSON数据,以及JSON数据处理有那些实用技巧呢?

我该用什么JSON序列化方式?

如何反序列化?

String jsonStr = '{ "icon": "http://www.devio.org/io/flutter_app/img/ln_food.png", "title": "美食林", "url": "https://m.ctrip.com/webapp/you/foods/address.html?new=1&ishideheader=true", "statusBarColor": "19A0F0", "hideAppBar": true }';
Map<String, dynamic> map = JSON.decode(jsonStr);

print('icon: ${map['icon']}');
print('title:${map['title']}');

通过上述方式可以将json字符串转换成Map,但Map中存放那些字段在使用的时候很不方便,如果将Map<String, dynamic>转成Model呢?

...
CommonModel model = CommonModel.fromJson(map);
print('icon: ${model.icon}');
print('title:${model.title}');

...
class CommonModel {
  final String icon;
  final String title;
  final String url;
  final String statusBarColor;
  final bool hideAppBar;

  CommonModel({this.icon, this.title, this.url, this.statusBarColor, this.hideAppBar});

  factory CommonModel.fromJson(Map<String, dynamic> json) {
    return CommonModel(
      icon: json['icon'],
      title: json['title'],
      url: json['url'],
      statusBarColor: json['statusBarColor'],
      hideAppBar: json['hideAppBar'],
    );
  }
}

 

复杂JSON解析?

如何解析对象中的数组?

{
  "url": "xxx",
  "tabs": [
    {
      "labelName": "推荐",
      "groupChannelCode": "tourphoto_global1"
    },
    {
      "labelName": "拍照技巧",
      "groupChannelCode": "tab-photo"
    }
  ]
}

解析:

class TravelTabModel {
  String url;
  List<TravelTab> tabs;

  TravelTabModel({this.url, this.tabs});

  TravelTabModel.fromJson(Map<String, dynamic> json) {
	 url = json['url'];
    (json['tabs'] as List).map((i) => TravelTab.fromJson(i));
  }
}

class TravelTab {
  String labelName;
  String groupChannelCode;

  TravelTab({this.labelName, this.groupChannelCode});

  TravelTab.fromJson(Map<String, dynamic> json) {
    labelName = json['labelName'];
    groupChannelCode = json['groupChannelCode'];
  }
}

 

如果要加些异常处理:

TravelTabModel.fromJson(Map<String, dynamic> json) {
    url = json['url'];
    if (json['tabs'] != null) {
      tabs = new List<TravelTab>();
      json['tabs'].forEach((v) {
        tabs.add(new TravelTab.fromJson(v));
      });
    }
  }

 

改成final:

class TravelTabModel {
  final String url;
  final List<TravelTab> tabs;

  TravelTabModel({this.url, this.tabs});

  factory TravelTabModel.fromJson(Map<String, dynamic> json) {
    String url = json['url'];
    List<TravelTab> tabs =
        (json['tabs'] as List).map((i) => TravelTab.fromJson(i)).toList();
    return TravelTabModel(url: url, tabs: tabs);
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值