Flutter如何更便捷的json转model

0x1 前言

做为刚开始接触flutter的iOS开发,json转模型这部分一直是我很是头疼的地方。如今网上能找到的方案通常有两种git

0x11 经过解析json建立模型文件

flutter里把反射直接禁掉了,这直接致使咱们不能动态的给模型赋值。咱们须要建立一个又一个的fromJson方法,而后在这个方法里取出一个又一个的数据赋值给模型。这是一部分重复且很是无聊代码。这种方式在使用的工程中也存在一系列的问题:github

  • 不符合咱们正常的开发习惯,通常咱们拿到的都是接口字段定义,与之相对应的json文件咱们是没有的,构建一个json文件这里又无故加了一部分工做量。
  • 无法对于数据作一些容错处理,在作旧业务迁移改造的时候这方面的问题会暴露出来,让人抓狂。
  • 后续添加删除字段比较麻烦

工具地址json

0x12 json_serializable

json_serializable用到了dart里的注解来自动生成代码。关于注解你能够类比是编译插件,在预编译的时候解析出模型里定义的字段,而后根据这些字段建立与之相对应的fromJson方法。这种方式和上面的方案某些层面很类似,可是又在必定程度上解决了上面提到的一些问题:api

  • 更加符合咱们的开发习惯,根据接口字段定义属性。
  • 经过脚本生成代码,添加删除字段更加方便。

还存在的问题:bash

  • 仍是无法对数据作容错处理。
  • 仍是存在一些须要手动添加的重复代码,以下红框中的代码。

0x2 更加便捷的方案

咱们先来梳理一下iOS里YYModel之类的框架是怎么作json自动转model的。首先经过runtime解析出定义的全部属性名、属性的类型。而后用这些属性名去json里取值赋值给model。那么咱们若是想要作一套相似的库的话咱们须要以下能力闭包

0x21 解析出模型里全部属性名、属性类型

flutter把dart里的反射禁掉了,期望系统的api确定是不现实了。咱们比较容易想到的是咱们能够手动输出这部份内容到一个全局的map里。要用的时候经过className去map里取。手动作确定不现实,这部分的数据是有规律性的,因此经过脚原本作很是合适。你研究过json_serializable的实现的话你必定知道注解。咱们能够用注解或者自定义builder来走一个预编译,在这个阶段咱们能解析类,获取参数名、参数类型。解析出这部分数据以后建立一个文件,而后把这些解析出来的数据根据特定的格式输出一个全局的map到刚才建立的文件里。我这边不聊具体实现,只聊方案。具体注解相关的使用能够看注解相关资料框架

0x22 动态建立对象

经过上面的步骤咱们能解析出属性的类型、属性名。对于自定义的对象来讲,就会存在一个根据类名来建立对应对象的需求。经过闭包来建立对象,用className作key闭包作value,而后把这边分数据也放到上一步解析出来的map里。工具

className : () => className()
复制代码

0x23 动态赋值

动态建立完对象以后咱们须要能给这个对象的属性来动态赋值。和以前建立对象的处理方式相似,咱们也能够经过闭包来作,咱们输出以下格式的内容到上面的map中post

name : (dynamic instance, value) => instance.name = value
复制代码

0x24 动态取值

在作model to json功能的时候咱们须要可以经过一个String格式的name去对象里动态获取这部分的数据。和上面用闭包来处理相似。咱们须要输出以下格式的内容到以前的map中ui

name : (dynamic instance) => instaned.name
复制代码

0x25 大体流程图

0x3 hn_easy_model

我这边已经实现了一套框架,配置完以后使用起来成本极低,对于客户端转过来写flutter的同窗也更友好。框架地址,欢迎你们试用。

相关文章
相关标签/搜索