什么是JSON?

JSON是一种轻量级的数据交换语言,JSON的全称为JavaScript Object Nation(JavaScript 对象表示语法),基于 ECMAScript,存放的是的类似于键值对,本质上来说是javascript的数据类型,是一种轻量级的数据交互格式,简单来说呢,json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。

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

  1. 小型项目:手动序列化;
  2. 大型项目:借助插件生成json_serializablebuilt_value

其实大型项目使用手动+借助下面提到的在线转换的方式更加灵活高效

这里有两个在线json转换的网站:
https://jsontodart.com/
https://www.bejson.com/json2javapojo/new/

如何反序列化?

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 Autogenerated {
  String url;
  List<Tabs> tabs;

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

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

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

class Tabs {
  String labelName;
  String groupChannelCode;

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

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

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['labelName'] = this.labelName;
    data['groupChannelCode'] = this.groupChannelCode;
    return data;
  }
}

如有错误,欢迎指正,共勉

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐