Flutter和Dart系列十:Json序列化

在前一篇我们已经可以在Flutter中同服务器进行交互了,但是那时我们是通过String来接收的,即可以拿到json格式的数据,那么怎么来解析成实体对象呢?

1. 手动解析:借助于dart的内置库(dart:convert)

dart:convert中有俩个top-level function:jsonDecode()、jsonEncode(),分别用来解析json和生成json。

给定一段json:

{
    "name": "David", 
    "age": 24
}

然后我们来看示例代码:

import 'dart:convert';  //引入dart:convert内置库

//手动编码创建Person类
class Person {
  String name;
  int age;

  Person({this.name, this.age});

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

  Map<String, dynamic> toJson() => {'name': name, 'age': age};
}


void testJson() {
  String json = '''{"name": "David", "age": 24}'''; //通过'''来定义json,不需使用转义字符
  Map<String, dynamic> personMap = jsonDecode(json);    //解析json
  Person person = Person.fromJson(personMap);   //转换成对象
  person.name = "lisi";
  person.age = 25;
  String json2 = jsonEncode(person.toJson());   //将对象编码成json表示形式
  print('$json2');
}

这种方式很容易理解,应付简单的json毫无压力。但是实际开发中,大多数情况下我们需要处理复杂的json,比如json对象嵌套,这种情况下再使用这种方式就显示特别麻烦了,这种时候就需要下面这种方式了

2. 使用json_serializable库及相关插件

  • 修改pubspec.yaml文件,添加依赖库:

    dependencies:
      json_annotation: ^2.0.0
    
    dev_dependencies:
    
      build_runner: ^1.0.0
      json_serializable: ^2.0.0
    
  • 点击Packages get,拉取依赖

  • 新建user.dart文件

    //第一步:导入json_annotation.dart
    import 'package:json_annotation/json_annotation.dart';
    
    //第二步:指定插件生成的中间代码文件名
    part 'user.g.dart';
    
    //第三步:使用JsonSerializable注解表明该类可json序列化
    @JsonSerializable()
    class User {
    
      String name;
      String email;
    
      User(this.name, this.email);
    
      // 同时工厂构造器和具名构造器  调用_$【类名】FromJson(json)
      factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
    
      // 定义toJson函数,调用_$【类名】ToJson(this);
      Map<String, dynamic> toJson() => _$UserToJson(this);
    
    }
    

    这个时候呢,编译器应该会提示相关语法错误,这是正常的。我们还有最后一步:

    在控制台输入以下命令:

    flutter pub run build_runner watch
    

    会产生以下变化:

    这个user.g.dart文件就是插件为我们生成的,并且之前的语法报错也会消失。不知道你有没有发现,这个命令运行之后并没有终止,意味着我们如果改变类的结构,比如添加个属性,user.g.dart也是及时改变。

    当然这最后一步还有一个可替代的命令:

    flutter pub run build_runner build
    

    这个只会编译一次就停止了,如果对类的结构有修改,需要再次执行此命令。

  • @JsonKey

这个注解的作用就类似于gson中的@SerializedName。如:

@JsonKey(name: 'create_time')
int createTime;

原始json的key是“create_time”,如果不使用@JsonKey注解,那么此处我们需要将该属性声明为create_time,但是这是不符合我们的命名规范的,所以我们可以通过此注解进行重命名。

3. 使用AndroidStudio中的插件:

然后在需要生成对应类的时候:

4. 使用在线dart生成工具:https://javiercbk.github.io/json_to_dart/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值