Dart 模型序列化 JSON

默认分类 2019-05-20 02:55 暂无评论

JSON 数据样本:

{
  "status": 200,
  "message": "请求成功",
  "data": {
    "page": 1,
    "count": 80,
    "list": [
      {
        "title": "文章标题 A"
      },
      {
        "title": "文章标题 B"
      }
    ]
  }
}

在 Dart 中序列化最简单的方法:

import 'dart:convert';

final String sample = '{"status": 200,"message": "请求成功","data": {"page": 1,"count": 80,"list": [{"title": "文章标题 A"},{"title": "文章标题 B"}]}}';

final Map<String, dynamic> article = json.decode(sample);
print(article['data']['count']); // 读取文章总数

但是这样我们只接收到了一个 Map<String, dynamic> 类型,只有运行时才知道值是什么类型,没有做到类型安全、自动补全、编译异常处理,比如 status 中不清楚是 int 类型还是 double 甚至就只是 String 类型,这个时候就需要模型序列化了。

import 'dart:convert';

final String sample = '{"status": 200,"message": "请求成功","data": {"page": 1,"count": 80,"list": [{"title": "文章标题 A"},{"title": "文章标题 B"}]}}';

class InitModel {
  final int status; // 要求字段为 int 类型
  final String message; // 要求字段为字符串类型
  final DataModel data; // 自定义类

  InitModel(this.status, this.message, this.data);

  InitModel.fromJson(Map<String, dynamic> json)
      : status = json['status'],
        message = json['message'],
        data = new DataModel.fromJson(json['data']);

  Map<String, dynamic> toJson() =>
  {
    'status': status,
    'message': message,
    'data': data
  };
}

class DataModel {
  final int page;
  final int count;
  final List<ArticleModel> list;

  DataModel(this.page, this.count, this.list);

  DataModel.fromJson(Map<String, dynamic> json)
      : page = json['page'],
        count = json['count'],
        list = List.from(json['list'].map((i) => new ArticleModel.fromJson(i)).toList());

  Map<String, dynamic> toJson() =>
  {
    'page': page,
    'count': count,
    'list': list
  };
}

class ArticleModel {
  final String title;

  ArticleModel(this.title);

  ArticleModel.fromJson(Map<String, dynamic> json)
       : title = json['title'];

  Map<String, dynamic> toJson() =>
  {
    'title': title
  };
}

main() {
  InitModel article;
  article = new InitModel.fromJson(json.decode(sample));
  print(article.data.count);
}

最近半个月一直肝 Flutter 简单记录一下这个笔记。。

暂无评论