Flutter学习总结(十九、Flutter的Json解析)

Flutter的Json解析

一起从0开始学习Flutter!

Json是我们最常用的数据传输格式,我们需要在发送数据的时候将对象转为Json,在收到数据后将Json转为对象,这需要我们的转化,我们可以自己手解这些Json字符串,也可以利用一些第三方库帮我们自动转化。
手动转化的我们引入转化的类库:

	import 'dart:convert';

引入之后我们就可以直接使用json库来帮助我们进行json和实体的转化了。
json解析:

	String jsonStr = '{"username":"flutter","password":"pwd"}';
    Map<String,dynamic> decode = json.decode(jsonStr);//这里帮助我们将json的字符串转为了Map集合
    print("username is ${decode['username']}");//这里使用Map的读取方式来获取username作为key的值

我们再把上面的decode转为json看是否可以:

	String codeStr = json.encode(decode);//直接将需要转的对象encode就可以了
    print("codeStr is ${codeStr}");//打印已经转为json的字符串

这是比较简单的json解析方式,我们再看下我们在项目中最常用的使用Json转对象的方法,我们可以在其他的平台看到有很多的转化的类库,我们这里使用官方提供给我们的json_serializable。
引入第三方的自动转化库:

dependencies:
  json_annotation: ^3.0.1
  json_serializable: ^3.3.0

创建一个实体类:

import 'package:json_annotation/json_annotation.dart';//引入第三方的类库
part 'user.g.dart';//在我们编译时会自动生成
@JsonSerializable()//这里告诉编译器它是一个需要解析json的类
class User{
  User(this.userName,this.password);
  @JsonKey(name:"name")//给字段在通过json转化的时候提供了一个别名
  String userName;
  String password;
//以下是固定写法,在写其他实体类时记得替换里面的名字就可以了
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

在写完这些会发现有些地方还标红,不能正常使用,我们还需要编译一下自动生成没有的类和代码。我们需要在项目的根目录下运行:

flutter packages pub run build_runner build

或者:

flutter packages pub run build_runner watch

第一种方式是手动构建,如果我们创建了需要转换的实体后需要进行一次构建。第二种是启动观察器自动帮助我们构建,当发现有需要转换的实体后会自动编译帮助我们构建缺少的文件。
如果运行上面的命令出现了下面的错误提示还需要我们引入自动构建的类库:

Could not find package "build_runner". Did you forget to add a dependency?
pub finished with exit code 65

添加类库:

dependencies:
	build_runner: ^1.10.0

然后就可以正常使用了,实体类的创建看起来比较繁琐,其实已经有很多的第三方已经帮助我们做好了创建实体类的工具,比如:
1、在线生成工具:JsonToDart
2、以Android Studio为例可以安装FlutterJsonBeanFactory插件,安装成功后,我们选择菜单栏的File->New的时候就多出了一个JsonToDartBeanAction,输入类名和想要解析的Json就得到了想要的Bean。
准备工作做好了,在使用的时候我们看下如何使用,还是以上一个例子中的json为例:

	//序列化为User对象
	User user = User.fromJson(json.decode(jsonStr));
    //将对象转化为String类型
    var userStr = User("flutter","pwd11").toJson();

面对复杂的对象类型还需要好好看下如果做好合理的结构,本篇的基本Json解析就学到这了。

接下来我们来一起学习Flutter的动画

你可能感兴趣的:(Flutter)