美文网首页FlutterRN And Flutter
Flutter中的JSON和序列化

Flutter中的JSON和序列化

作者: EasonZzz | 来源:发表于2019-04-19 15:03 被阅读123次

    Flutter中的JSON和序列化

    前言:本篇文章适合已经了解Dart基础语法的情况下阅读,若你对于Dart的一些基础语法还不熟悉,请移步于Dart中文网先学习基础语法,在阅读本篇文章:http://dart.goodev.org/guides/language/language-tour#classes

    1.在模型类中序列化JSON

    JSON:

    {
    "name": "John Smith",
    "email": "john@example.com"
    }
    

    引入dart:convert库,jsonDecode(jsonString)可以将JSON字符串转换成Map,jsonEncode(Object)方法将对象转换成JSON字符串。我们只需要建一个模型类将Map和对象相互转换就可以实现序列化。

    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.dart,新建一个fromJson命名构造函数,传入Map即可将Map转化成User对象,toJson函数,将对象转换成Map。

    Map userMap = jsonDecode(jsonString);//jsonDecode将JSON字符串转换成Map
    var user = new User.fromJson(userMap);//调用命名构造函数获取到获取到对象
    
    print('Howdy, ${user.name}!');
    print('We sent the verification link to ${user.email}.');
    

    如果要对User进行编码,直接将User对象传递给jsonEncode(user)方法,不需要再调用toJson()方法,因为jsonEncode()已经将这一步做了。

    String json = jsonEncode(user);
    

    但是,现实世界的场景通常不会那么简单。您不太可能使用如此小的JSON响应体。嵌套的JSON对象也是常有的。

    2.使用代码生成库序列化JSON

    json_serializable包,这是一个自动生成的源代码生成器,可为您生成JSON序列化样板。

    由于序列化代码不再是手动或手动维护的,因此可以最大限度地降低在运行时出现JSON序列化异常的风险。

    在项目中使用json_serializable,您需要一个常规依赖项和两个dev依赖项。简而言之,dev依赖项是我们的应用程序源代码中未包含的依赖项 - 它们仅在开发环境中使用。

    pubspec.yaml

    dependencies:
      ...
      json_annotation: ^2.0.0
    
    dev_dependencies:
      ...
      build_runner: ^1.0.0
      json_serializable: ^2.0.0
    

    单击编辑器上方的Packages get下载这些包

    以json_serializable方式创建模型类

    user.dart

    import 'package:json_annotation/json_annotation.dart';
    
    part 'user.g.dart';
    
    @JsonSerializable()
    class User extends Object {
    
      @JsonKey(name: 'name')
      String name;
    
      @JsonKey(name: 'email')
      String email;
    
      User(this.name,this.email,);
    
      factory User.fromJson(Map<String, dynamic> srcJson) => _$UserFromJson(srcJson);
    
      Map<String, dynamic> toJson() => _$UserToJson(this);
    
    }
    

    代码可以根据以下工具一键生成:https://caijinglong.github.io/json2dart/index_ch.html

    第一次创建json_serializable类时,会出现以下错误:

    1.png

    有两种运行代码生成器的方法。

    一次性代码生成
    通过运行flutter包,在项目根目录中运行build_runner build,可以在需要时为模型生成JSON序列化代码。这会触发一次性构建,该构建遍历源文件,选择相关文件,并为它们生成必要的序列化代码。

    尽管这是很方便的,每次当你对你的模型类做了修改的时候,你没必要每次都去手动运行一次。

    持续性地生成代码

    观察者使我们的源代码生成过程更加方便。它会监听项目文件中的更改,并在需要时自动构建必要的文件。通过在项目根目录中运行flutter packages pub run build_runner watch来启动观察程序。

    启动观察器一次,然后把它扔在后台运行是安全的。

    使用json_serializable模型:

    String jsonData = "{\"name\": \"EasonZzz\",\"eamil\": \"450622967@qq.com\"}";
    User user = User.fromJson(jsonDecode(jsonData));
    

    相关文章

      网友评论

        本文标题:Flutter中的JSON和序列化

        本文链接:https://www.haomeiwen.com/subject/fdnqgqtx.html