Flutter开发-01-JSON和序列化数据

系列文章目录


前言

虽然在前两年工作就不是全部时间在业务Coding上,而是重点转向架构了,但是自己在技术上还是要有所坚持,后续会继续抽时间把之前几年学习掌握的一些知识以及工作中积累的开发经验进行系统性的梳理,并且从本地的笔记中摘取部分文章整理在掘金博客上,大家互相学习。有不准确的地方,可以私信或者在评论区帮我指出来,我们共同探讨,学习,进步。Fighting~

本文记录下在Flutter中使用JSON和序列化相关的方法和要点,方便记忆。主要有两种方式,其中json_serializable为官方推荐使用的代码工具生成方式。另一种是直接使用插件生成序列化实体类。


一、使用代码生成库序列化 JSON 数据 json_serializable

1、在项目中pubspec.yaml中设置json_serializable:

dart 复制代码
dependencies:
  json_annotation: <latest_version>

dev_dependencies:
  build_runner: <latest_version>
  json_serializable: <latest_version>

2、使用 json_serializable 的方式创建模型类

JSON数据

json 复制代码
{
    "name":"Jerry",
    "email":"Jerry@example.com"
}

建立一个名为uer.dart的类:

dart 复制代码
import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User2 {
  String name;
  String email;

  User2(this.name, this.email);
}

代码生成方式有两种:

  • 一次性代码生成:在项目根目录运行命令:flutter pub run build_runner build --delete-conflicting-outputs ; 需要在每次修改模型类后手动构建;
  • 持续生成代码:在项目根目录运行命令:flutter pub run build_runner watch 来启动监听;使用监听器监听项目中的文件的变化,并在需要时自动构建必要的文件;启动监听并让它留在后台运行是安全的。

运行命令生成工具,会发现生成了名为user.g.dart的文件:

dart 复制代码
// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'user.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

User _$UserFromJson(Map<String, dynamic> json) => User(
      json['name'] as String,
      json['email'] as String,
    );

Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
      'name': instance.name,
      'email': instance.email,
    };

然后再user.dart文件中引入写入formJsontoJson 两个方法:

dart 复制代码
import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  String name;
  String email;

  User(this.name, this.email);

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

  Map<String, dynamic> toJson() => _$UserToJson(this);
}

3、使用 json_serializable 模型:

dart 复制代码
const jsonString = '{"name": "Jerry","email": "Jerry@example.com"}';
Map<String, dynamic> userMap = jsonDecode(jsonString);

if (kDebugMode) {
    print('User   $userMap');
}

var user = User.fromJson(userMap);

if (kDebugMode) {
	print('User   ${user.toString()}');
	print('User   ${user.toJson()}');
	print('User   ${jsonEncode(user)}');
	print('User   ${user.name}');
	print('User   ${user.email}');
}

查看打印日志:

dart 复制代码
User    {name: Jerry, email: Jerry@example.com}
User   Instance of 'User'
User   {name: Jerry, email: Jerry@example.com}
User   {"name":"Jerry","email":"Jerry@example.com"}
User   Jerry
User   Jerry@example.com

二、使用插件序列化JSON数据

1.下载插件 or 网页生成

网页生成链接:quicktype

2、使用:

使用插件生成:

网页生成:

生成代码一致,直接copy过来即可。

dart 复制代码
import 'dart:convert';

User userFromJson(String str) => User.fromJson(json.decode(str));

String userToJson(User data) => json.encode(data.toJson());

class User {
    User({
        required this.name,
        required this.email,
    });

    String name;
    String email;

    factory User.fromJson(Map<String, dynamic> json) => User(
        name: json["name"],
        email: json["email"],
    );

    Map<String, dynamic> toJson() => {
        "name": name,
        "email": email,
    };
}

3.解析数据

代码如下:

dart 复制代码
const jsonString = '{"name": "Jerry","email": "Jerry@example.com"}';
Map<String, dynamic> userMap = jsonDecode(jsonString);

if (kDebugMode) {
    print('User   $userMap');
}

var user = User.fromJson(userMap);

if (kDebugMode) {
	print('User   ${user.toString()}');
	print('User   ${user.toJson()}');
	print('User   ${jsonEncode(user)}');
	print('User   ${user.name}');
	print('User   ${user.email}');
}

查看打印日志:

dart 复制代码
User    {name: Jerry, email: Jerry@example.com}
User   Instance of 'User'
User   {name: Jerry, email: Jerry@example.com}
User   {"name":"Jerry","email":"Jerry@example.com"}
User   Jerry
User   Jerry@example.com

总结

本文简单记录了Flutter开发中的JSON数据的序列化操作方式,主要有两种方式,其中json_serializable为官方推荐使用的代码工具生成方式。另一种是直接使用插件生成序列化实体类,两者比较后,个人觉得使用插件相对比较方便。尤其是对于复杂的嵌套的JSON数据生成嵌套类 (Nested Classes) 生成代码,使用插件更为简便。嵌套类下一节介绍。多多支持点个赞,有错误的地方,多多指正,谢谢。

相关推荐
西西学代码9 小时前
Flutter---回调函数
开发语言·javascript·flutter
圣光SG9 小时前
Vue.js 从入门到精通:技术成长之路
flutter
Ants15 小时前
我用 AI 辅助开发了一系列小工具(1):文件提取工具
app·cli
恋猫de小郭18 小时前
Swift 6.3 正式发布支持 Android ,它能在跨平台发挥什么优势?
android·前端·flutter
i-阿松!21 小时前
PCB板子+ flutter前端 + go后端
物联网·flutter·pcb工艺·go1.19
恋猫de小郭21 小时前
Flutter 3.41.6 版本很重要,你大概率需要更新一下
android·前端·flutter
亚历克斯神1 天前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
钛态1 天前
Flutter 三方库 smartstruct 鸿蒙化字段映射适配指南:介入静态预编译引擎扫除视图及数据模型双向强转类型错乱隐患,筑稳如磐石的企业级模型治理防线-适配鸿蒙 HarmonyOS ohos
flutter·华为·harmonyos
键盘鼓手苏苏1 天前
Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构
flutter·harmonyos·鸿蒙·openharmony
左手厨刀右手茼蒿1 天前
Flutter 组件 http_requests 适配鸿蒙 HarmonyOS 实战:极简网络请求,构建边缘端轻量级 RESTful 通讯架构
网络·flutter·http