Flutter中的json序列化

一、前言

在Flutter中如果想使用数据类保存json数据的话要麻烦一些,本篇主要是将其中的开发过程以及遇到的一些问题进行记录

二、相关依赖:

使用序列化需要添加依赖,依赖如下:

dependencies:
  # Your other regular dependencies here
  json_annotation: <latest_version>

dev_dependencies:
  # Your other dev_dependencies here
  build_runner: <latest_version>
  json_serializable: <latest_version>

三、简单的示例代码

里面有一些代码可以直接从这里进行复制改下类名既可以,代码如下:

user.dart //文件名记得小写

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';//这行代码先写上,后面会编译项目后会根据这个名字进行生成

@JsonSerializable()
class User {
  User(this.name, this.email);//必须要有构造函数,可以是空构造函数,但是如果构造函数里面写参数的话记得给默认值

  String name;
  String email;

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);//用来将json内容转换为实体类,记得改下名字

  Map<String, dynamic> toJson() => _$UserToJson(this);//用来实体类转换为json,记得改下名字
}

四、嵌套类的代码示例代码

对于嵌套类来说,两个类不可以写在一个文件里面,对于其它语言中对于某些比较小的类写在一个文件中的写法这里不能使用

user.dart

import 'address.dart';
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';

@JsonSerializable(explicitToJson: true)//注意该参数
class User {
  String firstName;
  Address address;

  User(this.firstName, this.address);

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

address.dart

import 'package:json_annotation/json_annotation.dart';
part 'address.g.dart';

@JsonSerializable()
class Address {
  String street;
  String city;

  Address(this.street, this.city);

  factory Address.fromJson(Map<String, dynamic> json) => _$AddressFromJson(json);
  Map<String, dynamic> toJson() => _$AddressToJson(this);
}

五、继承类的写法

继承类的写法跟普通写法没有多大区别

六、生成.g文件

在上述文件中文件中需要生成.g文件。主要有以下两种方式:

1、一次生成的话使用终端在根目录执行以下命令:

flutter pub run build_runner build

2、持续生成的话使用终端在根目录执行以下命令:

flutter pub run build_runner watch

七、使用build_runner后续生成新文件的问题

当使用一次生成的话,后续有新的文件生成会遇到如下错误

 These outputs must be removed manually or the build can be run with `--delete-conflicting-outputs`

对于该问题才有以下命令进行解决

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

八、intl与build_runner的冲突问题

当使用国际化时候,如果在使用build_runner会出现缺少.dart_tool/flutter_gen/pubspec.yaml文件的问题,对于该问题新建一个名字叫pubspec.yaml的空文件即可

九、数据类的默认值问题

官网上给的代码一般会在构造函数里面写上变量,但是没有默认值。所以,如果定义的变量有默认值,但是构造函数里面没有默认值,在用的时候默认值还是为null。除非,定义时候赋默认值后,定义空构造函数或者构造函数里面也写上默认值。(建议用空构造函数,这样会简单些)

十、参考链接

  1. flutter中文官网:https://flutter.cn/docs/development/data-and-backend/json
  2. flutter 常见错误整理:https://blog.csdn.net/u014072642/article/details/108093697
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值