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

JSON 序列化方式

  • 手动序列化
  • 借助插件生成 json_serializable

项目开发中使用手动序列化和 json_to_dart 在线转换工具更灵活高效

如何序列化

将 JSON 格式的字符串转为 Dart 对象,这个可以通过 dart:convert 中内置的 JSON 解码器 json.decode() 来实现,该方法可以根据 JSON 字符串具体内容将其转为 List 或 Map,这样我们就可以通过他们来查找所需的值,如:

//一个JSON格式的用户列表字符串
String jsonStr = '[{"name":"Jack"},{"name":"Rose"}]';
//将JSON字符串转为Dart对象(此处是List)
List items = json.decode(jsonStr);
print('${items[0]['name']}!');
print('${items[1]['name']}.');  
String jsonStr = '{"name": "John Smith","email": "[email protected]"}';
Map map = json.decode(jsonStr);
print('Howdy, ${map['name']}!');
print('We sent the verification link to ${map['email']}.');

通过 json.decode() 将 JSON 字符串转为 List/Map 的方法比较简单,它没有外部依赖或其它的设置,对于小项目很方便。但在 List/Map 中存放那些字段在使用时很不方便也容易出错,这时将 List/Map 转成 Model 即可。

具体做法就是,通过预定义一些与 Json 结构对应的 Model 类,然后在请求到数据后再动态根据数据创建出 Model 类的实例。这样一来,在开发阶段我们使用的是 Model 类的实例,而不再是 Map/List,这样访问内部属性时就不会发生拼写错误。

例如,我们可以通过引入一个简单的模型类(Model class)来解决前面提到的问题,我们称之为 User。在 User 类内部,我们有:

  • 一个 User.fromJson 构造函数, 用于从一个 map 构造出一个User 实例 map structure
  • 一个 toJson 方法, 将 User 实例转化为一个 map.
class User {
  String name;
  String email;

  User({this.name, this.email});

  User.fromJson(Map json) {
    name = json['name'];
    email = json['email'];
  }

  Map toJson() {
    Map data = new Map();
    data['name'] = this.name;
    data['email'] = this.email;
    return data;
  }
}

采用这种新方法,我们可以非常容易地反序列化 user.

String jsonStr = '{"name": "John Smith","email": "[email protected]"}';
Map userMap = json.decode(jsonStr);
var user = new User.fromJson(userMap);

print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');

User 类字段修改成 final

class User {
  final String name;
  final String email;

  User({this.name, this.email});

  factory User.fromJson(Map json) {
    return User(name: json['name'], email: json['email']);
  }

  Map toJson() {
    Map data = new Map();
    data['name'] = this.name;
    data['email'] = this.email;
    return data;
  }
}

复杂 JSON 解析

解析对象中的数组
{
  "url": "xxx",
  "tabs": [
     {
        "labelName":"推荐",
        "channelCode":"photo_global"
     },
     {
        "labelName":"拍照",
        "channelCode":"tab_photo"
     }
  ]
}

解析:

class TravelModel {
  String url;
  List tabs;

  TravelModel(this.url, this.tabs);

  TravelModel.fromJson(Map json) {
    url = json['url'];
    if (json['tabs'] != null) {
      tabs = new List();
      json['tabs'].forEach((i) {
        tabs.add(new TravelTab.fromJson(i));
      });
    }
  }

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

class TravelTab {
  String labelName;
  String channelCode;

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

  TravelTab.fromJson(Map json) {
    labelName = json['labelName'];
    channelCode = json['channelCode'];
  }

  Map toJson() {
    final Map data = new Map();
    data['labelName'] = this.labelName;
    data['channelCode'] = this.channelCode;
    return data;
  }
}

修改为 final

class TravelModel {
  final String url;
  final List tabs;

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

  factory TravelModel.fromJson(Map json) {
    var tabsJson = json['tabs'] as List;
    List tabs = tabsJson.map((i) => TravelTab.fromJson(i)).toList();
    return TravelModel(url: json['url'], tabs: tabs);
  }
  
   Map toJson() {
    final Map data = new Map();
    data['url'] = this.url;
    if (this.tabs != null) {
      data['tabs'] = this.tabs.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class TravelTab {
  final String labelName;
  final String channelCode;

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

  factory TravelTab.fromJson(Map json) {
    return TravelTab(
        labelName: json['labelName'], channelCode: json['channelCode']);
  }

  Map toJson() {
    final Map data = new Map();
    data['labelName'] = this.labelName;
    data['channelCode'] = this.channelCode;
    return data;
  }
}

在项目中设置 json_serializable

在项目中设置json_serializable---- json_serializable设置方式

你可能感兴趣的:(Flutter - JSON解析与复杂模型转换实用技巧)