c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化

前言

Flutter 中没有类似于 Java 中 Gson/Jackson 这样的 JSON 序列化库。

因为这些库都是通过反射实现的,而 Flutter 中不支持反射。

其实 Dart 是支持反射的,只是 Flutter 禁用了而已。

Flutter 在 release 版本中会去除没有使用的代码,优化包大小。由于反射默认应用到所有代码,所以如果支持反射的话,就没法判断反射代码有没有被使用了。

dart 中的 JSON 处理

dart 中的 JSON 处理用到了核心库 dart:convert。

import 'dart:convert';

jsonDecode() 用来把 JSON 转化为 Map 或 List

看一下官方提供的例子:

var jsonString = '''

[

{"score": 40},

{"score": 80}

]

''';

var scores = jsonDecode(jsonString);

assert(scores is List);

var firstScore = scores[0];

assert(firstScore is Map);

assert(firstScore['score'] == 40);

jsonEncode() 用来把 Map 或 List 转化为 JSON

看一下官方提供的例子:

var scores = [

{'score': 40},

{'score': 80},

{'score': 100, 'overtime': true, 'special_guest': null}

];

var jsonText = jsonEncode(scores);

assert(jsonText ==

'[{"score":40},{"score":80},'

'{"score":100,"overtime":true,'

'"special_guest":null}]');

jsonDecode() 和 jsonEncode() 只支持 JSON 和 Map/List 之间的转换。如果要支持 JSON 和 Model 类之间的转换,需要自己实现方法去解析。

例如:

class User {

final String name;

final int age;

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

User.fromJson(Map json)

: name = json['name'],

age = json['age'];

Map toJson() => {

'name': name,

'age': age,

};

}

JSON 简单还好,如果 JSON 复杂的话,编写解析代码既耗时又容易出错。幸运的是,官方提供了自动生成解析代码的库。

自动生成解析代码

json_serializable 就是官方提供的自动生成解析代码的库。

添加依赖:

dependencies:

# 定义 json_serializable 库用到的一些注解

json_annotation: 3.0.1

dev_dependencies:

# 代码生成器

build_runner: 1.10.0

# 根据注解生成 Json 序列化和反序列化代码

json_serializable: 3.3.0

代码生成的相关库不需要打包进 release 版本,所以添加到 dev_dependencies 下。

添加注解并指定生成的类名:

import 'package:json_annotation/json_annotation.dart';

part 'User.g.dart';

@JsonSerializable()

class User {

final String name;

final int age;

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

}

用 @JsonSerializable() 修饰的 Model 类表示需要 JSON 序列化,之后执行相关命令会自动生成代码。

part 指定自动生成的类的名称。

执行命令生成相关代码:

flutter pub run build_runner build

执行完命令可以看到 User.g.dart 被生成了,_$UserFromJson 方法和 _$UserToJson 方法分别为反序列化和序列化的代码。

接下来我们修改 Model 类直接调用生成的代码:

import 'package:json_annotation/json_annotation.dart';

part 'User.g.dart';

@JsonSerializable()

class User {

final String name;

final int age;

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

factory User.fromJson(Map json) => _$UserFromJson(json);

Map toJson() => _$UserToJson(this);

}

当 Model 类有改动时,需要重新执行上述命令生成相关代码。

如果需要持续观察 Model 类的改动自动生成相应代码,可以执行如下命令:

flutter pub run build_runner watch

只需启动一次 watcher,它就会在后台运行,一旦 Model 类有改动,就会生成相应代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python相关函数_python列表相关函数

1、python中可用于列表的函数 (1)cmp(list1, list2)  比较两个列表的元素 (2)len(list)  列表元素个数 (3)max(list)  返回列表元素最大值 (4)min(list)  返回列表元素最小值…

财务模块的一些基础概念

财务会计承担着企业总体信息管理和传递的职能,无论企业采用何种运营模式、经营何种业务,都离不开财务的支持,大多数运营和管理流程均与财务存在着接口,为此,优化、高效的财务运作模式和流程成为确保企业良性发展和业务…

if mybatis tk 多个_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?...

前言这是 mybatis 比较常问到的面试题,我自己在以前的面试过程中被问到了2次,2次都是非常重要的面试环节,因此自己印象很深刻。这个题目我很早就深入学习了,但是一直没有整理出来,刚好最近一段时间由于工作太忙&#x…

多机器使用setnx 设置同一个key_Redisson分布式锁的简单使用

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!一:前言我在实际环境中遇到了这样一种问题,分布式生成id的问题!因为业务逻辑的问题,我有个生成id的方法,是根据…

java学习笔记3--类与对象的基础

1、面向对象的程序设计方法概述 面向对象的程序设计 与结构化程序设计方法相比,更符合人类认识现实世界的思维方式,已成为程序设计的主流方向 涉及的主要概念:抽象、封装、继承、多态 对象 现实世界中:万物皆对象,都具…

孟德尔随机化周报 (12.14)

欢迎报名2023年郑老师团队课程! 郑老师科研统计培训,包括临床数据、公共数据分析课程等,欢迎报名 孟德尔随机化,Mendilian Randomization,简写为MR,是一种在流行病学领域应用广泛的一种实验设计方法,利用公…

android计算器弹窗,android实现简易计算器

本文实例为大家分享了android实现简易计算器展示的具体代码,供大家参考,具体内容如下效果图:一、如图,首先布局计算器主页显示activity_main.xmlxmlns:tools"http://schemas.android.com/tools"android:layout_width&qu…

多选取值_机制砂如何控制MB值和石粉含量

随着环保政策的加强和河沙采挖禁令的收紧,机制砂逐渐成为建筑用砂的主流。但很多砂石厂生产设备落后、生产条件简陋、生产工艺不完善导致生产的机制砂品质低,质量不能满足高等级混凝土的要求。不仅卖不上价格,还浪费了矿石资源,挣…

python爬虫哪个选择器好用_Python网络爬虫四大选择器用法原理总结

前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信息。今天小编来给大家总结一下这四个选择器,让大家更加深刻的理解和熟悉Python选择器。 一、正则表达式 正则表达式为我们提供了…

C++primer习题--第3章

【习题 2.11】 编写程序&#xff0c;要求用户输入两个数——底数&#xff08; base&#xff09;和指数&#xff08; exponent&#xff09;&#xff0c;输出底数的指数次方的结果。 #include <iostream> #include <math.h> #include <string> using namespace…

eclipse配置python开发环境_eclipse怎样搭建Python开发环境

eclipse通过pydev插件也是可以搭建出Python开发环境的。今天小编我就来给大家分享一下eclipse怎样搭建Python开发环境的经验哦。 工具/原料 电脑 eclipse Python pydev插件链接&#xff1a;https://pan.baidu.com/s/1VIK5H_ZbC6DsOlNwy2OwLw 密码&#xff1a;kg8a 方法/步骤 1 …

android光照传感器,详解 android 光线传感器 light sensor的使用

调用anroid的光线传感器使用。实现效果图&#xff1a;MainActivity.Javapackage hk.ust.cse.comp107x.ligthsensor;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import …

hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

全文由下面几个部分组成&#xff1a;先分享一下拉链表的用途、什么是拉链表。通过一些小的使用场景来对拉链表做近一步的阐释&#xff0c;以及拉链表和常用的切片表的区别。举一个具体的应用场景&#xff0c;来设计并实现一份拉链表&#xff0c;最后并通过一些例子说明如何使用…

算法导论:堆排序

堆 堆是一个数组&#xff0c;它可以被看成一个近似的完全二叉树&#xff0c;树上的每一个结点对应数组中的一个元素。除去最底层外&#xff0c;该树是完全充满的&#xff0c;而且从左到右填充。 用数组A表示堆&#xff0c;从数组第1个元素开始&#xff0c;数组中第i&#xff08…

python网址太长_【原创】分享一个自己用python写的长网址转短网址工具,给需要的你...

[Python] 纯文本查看 复制代码import requests import json from tkinter import * class Get_url_short(): def __init__(self): self.source 2540340328 self.url https://api.t.sina.com.cn/short_url/shorten.json? def get_short(self): try: url_long self.tk_url_lo…

扩展坞可以把手机投到显示器吗_解锁4K 60Hz毕亚兹USB Type-C扩展坞体验

现在很多白领办公、学生上网课都会使用到笔记本电脑&#xff0c;尤其是近两年的轻薄本&#xff0c;为了追求轻量化&#xff0c;砍掉了原本很多的接口&#xff0c;转而使用Type-C来代替&#xff0c;从而导致接驳外设的时候非常不方便。特别是那种只给了一个USB标准接口的电脑&am…

Android view.settran,Android RecyclerView从入门到玩坏

目录前言基础使用分隔线点击监听搭配CardView更丰富的条目增删条目快速添加视图让RecyclerView支持复杂视图最后前言RecyclerView在Android界面开发当中是很重要的, 那掌握它也是很必要的. 但是有些时候会觉得它很厚重, 这里就从RecyclerView的基础一直说到扩展, 让你把Recycle…

python提取英文单词 每行显示一个_使用python对文件中的单词进行提取

由于需要使用一个纯单词组成的文件&#xff0c;在网上下载到了一个存放单词的文件&#xff0c;但是里面有中文的解释&#xff0c;那就需要做一下提取了。 文本的形式如下&#xff1a;所见即所得&#xff0c;这个文本是有规律的&#xff0c;每个单词为一行&#xff0c;紧接着下一…

微服务feignclient_搞微服务用阿里开源的 Nacos 真香啊

本文适合有 Java 基础知识的人群本文作者&#xff1a;HelloGitHub-秦人HelloGitHub 推出的《讲解开源项目》系列&#xff0c;今天给大家带来一款开源 Java 版可以实现动态服务发现&#xff0c;配置和服务管理平台——Nacos&#xff0c;它是阿里巴巴团队推出的&#xff0c;符合国…

linux shell脚本备份mysql数据库

#!/bin/sh# 备份数据库# Mysql 用户名密码 MYSQL_USERroot MYSQL_PASSroot BACKUP_DIR/data/backup/mysql DATA_DIR/data/backup/dbdata# 查询mysql中所有数据库名字 SQL_STRING"SELECT SCHEMA_NAME AS db FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN (my…