服从翻倍!大型Flutter项目快速实现JSON转Model实战

源代码 2024-9-15 18:18:45 15 0 来自 中国
一、媒介

在原生应用开辟中,我们通常会利用YYModel、SwiftyJSON、GSON等库实现JSON剖析,并利用JSONConverter等雷同工具实现JSON自动转模子,极大的进步工作服从。
但在Flutter开辟中,却并没有雷同的剖析库给我们利用,由于如许的库必要利用运行时反射,这在 Flutter 中是禁用的。运行时反射会干扰 Dart 的 tree shaking,利用_tree shaking_,可以在 release 版中“去除”未利用的代码,这可以显著优化应用步调的巨细。由于反射会默认应用到全部代码,因此_tree shaking_会很难工作,由于在启用反射时很难知道哪些代码未被利用,因此冗余代码很难剥离,以是 Flutter 中禁用了 Dart 的反射功能,而正因云云也就无法实现动态转化 Model 的功能。
二、json_serializable

固然不能在Flutter中利用运行时反射,但官方提供了雷同易于利用的API,它是基于代码天生库实现,json_serializable package,它是一个自动化的源代码天生器,可以天生JSON序列化模板,由于序列化代码无需手写和维护,将运行时产生JSON序列化非常的风险降至最低,利用方法如下:
1. 在项目中添加json_serializable

要包罗json_serializable到我们的项目中,必要一个通例和两个开辟依靠项。简而言之,开辟依靠项是不包罗在我们的应用步调源代码中的依靠项。
通过此链接可以检察这些所需依靠项的最新版本 。
1.png 在您的项目根文件夹中运行 flutter packages get(大概在编辑器中点击 “Packages Get”) 以在项目中利用这些新的依靠项.
2.  以json_serializable的方式创建model类

让我们看看怎样将我们的User类转换为一个json_serializable。为了简单起见,我们利用前面示例中的简化JSON model。
user.dart
import 'package:json_annotation/json_annotation.dart';// user.g.dart 将在我们运行天生下令后自动天生part 'user.g.dart';///这个标注是告诉天生器,这个类是必要天生Model类的@JsonSerializable()class User {  String name;  String email;  User(this.name, this.email);  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);  Map<String, dynamic> toJson() => _$UserToJson(this);}有了这个设置,源码天生器将天生用于序列化name和email字段的JSON代码。
如果必要,自界说命名计谋也很容易。比方,如果我们正在利用的API返回带有snake_case的对象,但我们想在我们的模子中利用lowerCamelCase, 那么我们可以利用@JsonKey标注:
@JsonKey(name: 'registration_date_millis')final int registrationDateMillis;3.  运行代码天生步调


  • 一次性天生
    通过在我们的项目根目次下运行flutter packages pub run build_runner build,我们可以在必要时为我们的Model天生JSON序列化代码。 这触发了一次性构建,它通过我们的源文件,挑选干系的并为它们天生必要的序列化代码。
  • 一连天生
    固然这非常方便,但如果我们不必要每次在model类中举行更改时都要手动运行构建下令的话会更好。
    利用watcher可以使我们的源代码天生的过程更加方便。它会监视我们项目中文件的厘革,并在必要时自动构建必要的文件。我们可以通过flutter packages pub run build_runner watch在项目根目次下运行来启动watcher
    只需启动一次观察器,然后并让它在配景运行,这是安全的
4.  利用json_serializable模子

要通过json_serializable方式反序列化JSON字符串,我们不必要对先前的代码举行任何更改。
Map userMap = JSON.decode(json);var user = new User.fromJson(userMap);序列化也一样。调用API与之前雷同。
String json = JSON.encode(user);有了json_serializable,我们只必要编写User类文件 。源代码天生器创建一个名为user.g.dart的文件,它具有全部必须的序列化逻辑。 现在,我们不必编写自动化测试来确保序列化的正常工作 - 这个库会确保序列化工作正常。
三、 JSONConverter

如上面所写,即便利用了json_serializable,仍然必要手动编写模子类文件并逐一编写对应的模子属性,生产工作中一个项目大概会有几百个API, 如果全部手写仍旧浪费大量摸鱼的时间,这里我们可以利用JSONConverter, 它可根据配景返回的JSON自动天生模子文件,共同json_serializable,可以非常方便的实现接口对接,模子文件一键天生,极大节省步调员的体力。
2.png 另外JSONConverter除了支持Flutter,还支持其他语言和第三方库,功能大概说非常丰富了。


四、总结

生产项目中保举利用json_serializable +  JSONConverter 完成服务端返回的JSON数据剖析工作,服从翻倍!!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 22:36, Processed in 0.185386 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表