对 Flutter JSON序列化的一些理解

在没有类型检查的语言(JavaScript)中,当你需要从 https://api.github.com/users/icepy 获取数据来更新UI时,最大的可能也就是 JSON.parse 一下,然后直接 data['login'] 来使用,这并不是一个很好的注意。当你开始使用 TypeScript 时,也许你会:

interface IResult {
 login: string;
 id: number;
 node_id: string;
 avatar_url: string;
}

interface IResponse<T> {
 data: T
}

定义这样的接口来描述你将使用的字段名,这会是一个很好的开始。

在 Flutter 的世界里你也可以很简单的去 parse 一下然后使用这些数据,导入 dart:convert即可,在一个简单的例子中我们来展示该如何使用:

import 'dart:convert';

Map<String, dynamic> user = jsonDecode(jsonString);

user['login']user['id']

不过,我们可以将它改造的更有用一些,如果你了解过传统的 MVC 模型,那么你就知道定义一个 Model 会非常有用。让我们接上一个例子,写一个 AVModel 类然后稍微改造一下:

class AVModel {
 final String name;
 final int id;
 final String avatar; AVModel(this.name, this.id, this.avatar); AVModel.fromJSON(Map<String, dynamic> json)
        :id = json['id'],
        name = json['login'],
        avatar = json['avatar_url'];
}Future<Future<String>> dingFuture = new Future(_getAsyncMyUserInfo);

dingFuture.then((done){
 done.then((contents){
   var data = jsonDecode(contents);
   var avModel = AVModel.fromJSON(data);
   _updateUI(avModel);
 });
});

_updateUI(AVModel avModel){
 setState(() {
   _avName = avModel.name;
   _avImage = avModel.avatar;
 });
}

和请求模块一样,Dart Team官方也提供了一个封装程度较高的 package https://pub.dartlang.org/packages/json_annotation。

序列化和反序列化多数的方案都是为了方便管理业务数据而生的,Dart 团队和社区在这方面讨论诸多,我们只需要借鉴和思考哪些方案是适合现阶段的业务,哪些方案是未来可以升级改造的,有时候过度的优化,反而对实现有了太强的约束,合适真的很重要。

本文分享自微信公众号 - 子曰五溪(fed-talk)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券