美文网首页Flutter
Flutter 使用 json_serializable序列化j

Flutter 使用 json_serializable序列化j

作者: kindom_0129 | 来源:发表于2019-09-26 15:43 被阅读0次

    Flutter使用中json、model转换是个麻烦事,官方文档中提供了一种使用方式来序列化json.

    json_serializable package包: 它是一个自动化的源代码生成器,可以为我们生成JSON序列化模板。
    由于序列化代码不再由我们手写和维护,我们将运行时产生JSON序列化异常的风险降至最低。

    具体步骤:

    1.在项目中设置json_serializable
    要包含json_serializable到我们的项目中,我们需要一个常规和两个开发依赖项。简而言之,开发依赖项是不包含在我们的应用程序源代码中的依赖项。
    pubspec.yaml:

    dependencies:
      # Your other regular dependencies here
      json_annotation: ^2.0.0
    
    dev_dependencies:
      # Your other dev_dependencies here
      build_runner: ^1.0.0
      json_serializable: ^2.0.0
    

    然后在项目根文件夹中运行 flutter packages get (或者在编辑器中点击 “Packages Get”) 以在项目中使用这些新的依赖项.

    2.代码部分

    import 'package:json_annotation/json_annotation.dart';
    
    // user.g.dart 将在我们运行生成命令后自动生成
    part 'user.g.dart';
    
    ///这个标注是告诉生成器,这个类是需要生成Model类的
    @JsonSerializable()
    
    class User{
      User(this.name, this.email);
    
      String name;
      String email;
      //不同的类使用不同的mixin即可
      factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
      Map<String, dynamic> toJson() => _$UserToJson(this);
    }
    

    注意:必须加上@JsonSerializable()已告知此类需要序列化,此时会有几个错误,无需理会,当命令执行完后会自动解决。

    如果需要,自定义命名策略也很容易。例如,如果我们正在使用的API返回带有【snake_case】的对象,但我们想在我们的模型中使用lowerCamelCase, 那么我们可以使用@JsonKey标注:

    /// Tell json_serializable that "registration_date_millis" should be
    /// mapped to this property.
    @JsonKey(name: 'registration_date_millis')
    final int registrationDateMillis;
    

    3.运行代码生成器来为我们生成序列化模板

    首先到项目根目录下,之后有两种运行代码生成器的方法

    • 一次性生成:
    flutter packages pub run build_runner build
    
    • 持续生成
      使用watcher可以使我们的源代码生成的过程更加方便。它会监视我们项目中文件的变化,并在需要时自动构建必要的文件。
      只需启动一次观察器,然后并让它在后台运行,这是安全的。
    flutter packages pub run build_runner watch
    

    注意:如果已经生成过了(产生了xxx.g.dart文件),再执行命令时会报错,需要删除原来的.g.dart文件。可以手动删除也可以在命令行里添加--delete-conflicting-outputs来删除

     flutter packages pub run build_runner build --delete-conflicting-outputs
    

    4.如何使用

    要通过json_serializable方式反序列化JSON字符串,我们不需要对先前的代码进行任何更改。

    Map userMap = JSON.decode(json);
    var user = new User.fromJson(userMap);
    

    序列化也一样。调用API与之前相同。

    String json = JSON.encode(user);
    

    相关文章

      网友评论

        本文标题:Flutter 使用 json_serializable序列化j

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