简介
在日常开发中,通过网络请求获取后端接口回来一些结构化字符串数据,如json,xml等。前端无法直接运用这些json数据,需求将json格式的字符串转为可运用的类对象或Dart对象。与java不同的是,Flutter无法直接生成数据解析类,需求通过第三方东西生成。本文首要介绍在Flutter中怎么完成数据解析。
比照
因为Java和Kotlin言语提供有JackSon和Gson序列化类库,能够直接运用。关于Flutter来说,因为这些序列化库都需求运用运转时反射,Flutter不支持,所以需求手动完成。
示例:关于字符串“[{ “name”: “Jack”,”age”: 19}]”,不同言语的数据类如下。
- Java
class Person{
private String name;
private int age;
pubilic setAge(int age){
this.age = age;
}
public getAge(){
return age;
}
pubilic setName(int name){
this.name = name;
}
public getName(){
return name;
}
}
- kotlin
data class Person(val name:String,val age:Int)
- flutter
import 'package:json_annotation/json_annotation.dart';
part 'person.g.dart';
List<Person> getPersonList(List<dynamic> list){
List<Person> result = [];
list.forEach((item){
result.add(Person.fromJson(item));
});
return result;
}
@JsonSerializable()
class Person extends Object with _$PersonSerializerMixin{
@JsonKey(name: 'name')
String name;
@JsonKey(name: 'age')
int age;
Person(this.name,this.age,);
factory Person.fromJson(Map<String, dynamic> srcJson) =>
_$PersonFromJson(srcJson);
}
从三种言语各自生成的数据类比照来看,kotlin最简单,java手写也能完成,Flutter的数据类看起来比较复杂,运用的json也只要两个特点,正常开发过程中,对象类的特点很多,假如手写过于复杂而且容易犯错。这个时分能够需求借助第三方东西完成。
引进
在Flutter工程的pubspec.yaml文件中,增加json_annotation和json_serializable对应版本依赖,然后点击编译东西上的提示 Pub get或许指令行输入flutter pub get即可导入库文件。
基本运用
- 在浏览器中翻开json2dart_for_json_serializable网站。
- 将接口回来的json字符串粘贴到左面输入框内。然后点击下边的格式化。生成对应的数据类。
- 修改类名。类名支持自定义,默认为Entity,修改完成后,点击下载生成对应的dart文件,或直接点击仿制代码。
- 在咱们的项目根目录下运转:flutter packages pub run build_runner build 指令,生成一个person.g.dart文件,
- 这时一个完整的数据类就完成了。能够电源Person.fromJson直接进行数据解析。
_getItemList() async{
Response response = await ApiManager.getKnowledgeList(mPage,widget.cid);
if(response.statusCode == NetCode.succeed){
setState(() {
if(mPage == 0) list.clear();
list.addAll(Person.fromJson(jsonDecode(response.body)).data.datas);
});
}
}
注意事项
需求注意的是:假如修改了数据类中的字段,需求删去 person.g.dart文件,然后运转指令从头生成即可。
总结
本文介绍的是一种Flutter数据类的常用生成办法,当然还有其他生成办法,但是本文介绍的办法是官方引荐的。其他办法有必定的缺点。引荐我们运用这种方法生成数据类。
本文介绍常见数据解析类的生成运用。为后续实战打好基础。对实战项目感兴趣的同学,能够点击关注小编!