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解码器。
- 下面是一个简单的用户model
{
"name": "John Smith",
"email": "john@example.com"
}
- 序列化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存在于地图结构中,因此是编译器不知道的错字。
- 在模型类中序列化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解析
- 安装插件
- 使用插件 右击包->New->JsonToDartBeanAction弹出如下界面
输入类名和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:convert
和FlutterJsonBeanFactory
插件我们就可以愉快地进行json解析啦!
注:json解析插件支持空安全和非空安全两种生成模型的方式,如果要使用生成空安全的模型,则您的dart版本至少要大于2.12.0,否则请选择以非空安全的方式来生成bean。
environment:
sdk: ">=2.12.0 <3.0.0"
转载自:https://juejin.cn/post/6956176704574324767