阅读 1681

Flutter的json解析

Flutter中是否有Gson、FastJson这样的库

在Android原生开发中,我们有很好用的Gson、FastJson等第三方库来帮助我们将json转成实体类。但是,在Flutter中可能不会有这样的第三方库供我们使用了,详细原因请看点我点我大致就是,这些第三方库都是使用反射来吧json转成实体类的,而flutter禁止反射。那么没有json解析库我们在flutter中如何转换json到实体类呢?

使用dart:convert手动序列化JSON

Flutter中的基本JSON序列化非常简单。flutter中有一个内置的dart:convert库,其中包含一个简单的json编码器和json解码器。

  1. 下面是一个简单的用户model
{
  "name": "John Smith",
  "email": "john@example.com"
}
复制代码
  1. 序列化json 转 map

通过dart:convert库中的jsonDecode()方法,我们可以吧json字符串作为它的参数,把json转成Map

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

print('Howdy, ${user['name']}!');
print('We sent the verification link to ${user['email']}.');
复制代码

问题是,jsonDecode()返回的是一个Map<String,dynamic>,dynamic是动态类型,表示您直到运行时才知道这些值的类型。使用这种方法,您将失去大多数静态类型语言的功能:类型安全性,自动完成功能,最重要的是,编译时异常。您的代码将立即变得更容易出错。例如,每当您访问name或email字段时,您都可以快速输入错字。JSON存在于地图结构中,因此是编译器不知道的错字。

  1. 在模型类中序列化json

我们可以通过一个引入的模型类User来解决前面遇到的问题。在User中我们定义:

  • 一个User.fromJson()构造函数,从Map结构对象构造一个新的User实例
  • 一种toJson()将User实例转换为Map的方法。

user.dart

class User {
 final String name;
 final String email;

 User(this.name, this.email);

 User.fromJson(Map<String, dynamic> json)
     : name = json['name'],
       email = json['email'];

 Map<String, dynamic> toJson() => {
       'name': name,
       'email': email,
     };
}
复制代码

现在解码的逻辑已经移动到了模型的User的内部,使用这种新方法,你可以轻松解码一个user实例

Map<String, dynamic> userMap = jsonDecode(jsonString);
var user = User.fromJson(userMap);

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

要加密user的话您可以吧user对象传到jsonEncode()函数中,无需调用toJson()方法即可把user实例转换成json字符串

String userJson = jsonDecode(user);

复制代码

通过这种方式,我们可以做到简单的json序列化,但是问题也变得非常复杂。通常我们在java中只需要执行一步的json解析在dart中我们需要拆分成两步,先在dart中调用jsonDecode方法转成map,然后还需要在模型中定义相关方法。

  • 必须利用jsonDecode方法把json字符串先转成Map
  • 模型类中必须定义fromJson和toJson的函数,此函数在数据复杂的情况下会非常难写
  • 对于嵌套类型的json结构,事情又变得更加复杂。大大影响我们的开发效率

那么既然json序列化用起来如此复杂,我们有没有更好的方式来进行处理呢?请看下面!

使用第三方插件来进行json解析

  1. 安装插件

image.png

  1. 使用插件

右击包->New->JsonToDartBeanAction弹出如下界面

image.png

输入类名和json字符串,我们就可以方便的得到想要的模型类啦。

例如:

import 'package:kooielts/generated/json/base/json_convert_content.dart';

class DogEntity with JsonConvert<DogEntity> {
	String code;
	String message;
	List<DogObj> obj;
}

class DogObj with JsonConvert<DogObj> {
	String appName;
	String nickName;
	String appId;
	String headImage;
	int userId;
}
复制代码

此类中 JsonConvert基类帮我们完成了 从map到模型(fromJson方法)和从模型到map(toJson方法)的转换。至此,结合dart原生库,dart:convertFlutterJsonBeanFactory插件我们就可以愉快地进行json解析啦!

注:json解析插件支持空安全和非空安全两种生成模型的方式,如果要使用生成空安全的模型,则您的dart版本至少要大于2.12.0,否则请选择以非空安全的方式来生成bean。

image.png

environment:
 sdk: ">=2.12.0 <3.0.0"
复制代码
文章分类
Android
文章标签