Gson的基本使用:解析Json格式数据 序列化与反序列化

目录

一,Gson和Json

1,Gson

2,Json

3,Gson处理对象的几个重要点

4,序列化和反序列化

二,Gson的使用

1,Gson的创建

2,简单对象序列化

3,对象序列化,格式化输出日期

4,嵌套对象序列化

5,对象数组序列化

6,对象集合序列化


一,Gson和Json

1,Gson

        Gson是Google发布的一个Java库,可以用来将Java对象转换为Json字符串表示,或者将Json字符串转换为等效的Java对象;

2,Json

        Json(JavaScript Object Notation),一种轻量级的数据交换格式,应用于不同平台间的数据传递,例如服务端和客户端的交互,数据在两端以Json格式传递;

Json格式为字符串格式,基本格式为大括号括起的键值对形式:

{"name": "zhangsan","sex": "man","age": 18
}

3,Gson处理对象的几个重要点

(1)推荐将成员变量都声明为private;

(2)所有包含在当前类(包括父类)中的字段都默认被序列化或者反序列化,即实现了Serializable接口;

(3)被transient和static关键词修饰的字段不会被序列化或反序列化;

4,序列化和反序列化

序列化:将Java对象转化为字节序列的过程;

反序列化:将字节序列恢复为Java对象的过程;

二,Gson的使用

在Android中使用Gson需要先添加依赖:

implementation 'com.google.code.gson:gson:2.10.1'

1,Gson的创建

        Gson可以通过调用new Gson()来创建它的对象,或者通过GsonBuilder类来创建Gson实例,它具有各种设置,如版本控制,格式化输出,设置日期输出格式等;

(1)通过构造器实例化:

Gson gson = new Gson();

(2)通过GsonBuilder类实例化:

Gson gson = new GsonBuilder().serializeNulls() //允许导出null值.setPrettyPrinting() //格式化输出.setDateFormat("yyyy/mm/dd") //日期输出格式.create();

        当序列化时,如果对象的某个字段为null,是不会输出到Json字符串中的。如果想要输出null值的话,需要用GsonBuilder类来创建Gson对象,并设置允许导出null值;

2,简单对象序列化

创建一个简单的Student类:

public class Student implements Serializable {private String name;private int id;//getter setter方法,构造器
}

使用toJson()方法对Java对象序列化:

private void objToJson() {Student student = new Student(null, 114514);String jsonStr = gson.toJson(student);edt_json.setText(jsonStr);
}

使用fromJson()方法反序列化,fromJson方法需要提供Json字符串对象的class类

private void jsonToObj() {String jsonStr = edt_json.getText().toString();Student student = gson.fromJson(jsonStr, Student.class);edt_obj.setText(student.toString());
}

运行结果如下: 

3,对象序列化,格式化输出日期

想要格式化输出日期,需要通过GsonBuilder类创建Gson对象并设置日期输出格式:

Gson gson = new GsonBuilder().setDateFormat("yyyy/mm/dd") //日期输出格式.create();

(1)对象序列化:

private void formatObjToJson() {Student student = new Student("喜多郁代", 114514);SimpleDateFormat format = new SimpleDateFormat("yyyy/mm/dd");Date date = null;try {date = format.parse("1999/9/9");} catch (ParseException e) {throw new RuntimeException(e);}student.setDate(date);String jsonStr = gson.toJson(student);edt_json.setText(jsonStr);
}

(2)反序列化:

private void formatJsonToObj() {String jsonStr = edt_json.getText().toString();Student student = gson.fromJson(jsonStr, Student.class);edt_obj.setText(student.toString());
}

运行结果如下:  

 

4,嵌套对象序列化

当类中具有内部类时,Json数据形式为:

{"name":"John", 
"age":20,
"grade":{"course":"English","score":100,"level":"A"}
}

定义含有内部类的类:

public class Student implements Serializable {private String name;private int id;private Date date;private Grade grade;//getter,setter,构造器
}
public class Grade implements Serializable {private int math;private int code;//getter,setter,构造器
}

(1)序列化:

private void complexObjToJson() {Student student = new Student("喜多郁代", 114514);Grade grade = new Grade(99, 100);student.setGrade(grade);String jsonStr = gson.toJson(student);edt_json.setText(jsonStr);
}

(2)反序列化:

private void complexJsonToObj() {String jsonStr = edt_json.getText().toString();Student student = gson.fromJson(jsonStr, Student.class);edt_obj.setText(student.toString());
}

运行结果如下:  

 

5,对象数组序列化

(1)序列化:

private void arrayObjToJson() {Student[] students = new Student[2];students[0] = new Student("喜多郁代", 1);students[1] = new Student("山田凉", 2);String jsonStr = gson.toJson(students);edt_json.setText(jsonStr);
}

(2)反序列化:

private void arrayJsonToObj() {String jsonStr = edt_json.getText().toString();Student[] students = gson.fromJson(jsonStr, Student[].class);edt_obj.setText(Arrays.asList(students).toString());
}

运行结果如下:   

 

6,对象集合序列化

对于List这种泛型信息的类,在反序列时需要使用TypeToken类来指明具体的类型;

(1)序列化与之前一致:

private void collectionObjToJson() {List<Student> studentList = new ArrayList<>();studentList.add(new Student("喜多郁代", 1));studentList.add(new Student("山田凉", 2));String jsonStr = gson.toJson(studentList);edt_json.setText(jsonStr);
}

(2)反序列化时使用TypeToken类来指明List泛型具体的类型:

private void collectionJsonToObj() {String jsonStr = edt_json.getText().toString();Type collectionType = new TypeToken<List<Student>>(){}.getType();//泛型为List<Student>List<Student> studentList = gson.fromJson(jsonStr, collectionType);edt_obj.setText(studentList.toString());
}

运行结果如下:  

 

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

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

相关文章

Wordpress安装到win10(2024年7月)

目录 1.wordpress介绍 2下载应用 2.1.wordpress 2.2XAMPP 2.3 PHPmyadmin 3.配置应用 3.1XAMPP进程 3.2 文件配置 3.3 phpmyadmin配置 4.配置网页 4.1 数据库创建 4.2 安装wordpress 5.进入面板 6.总结 1.wordpress介绍 WordPress是一个开源内容管理系统&#xff0…

Java台球厅助教教练预约上门到店系统源码

&#x1f3b1;一杆在手&#xff0c;天下我有&#xff01;台球助教教练预约系统&#xff0c;让球技飙升不是梦&#x1f680; &#x1f3af;【开篇&#xff1a;台球爱好者的福音来啦&#xff01;】&#x1f3af; 还在为找不到合适的台球教练而烦恼吗&#xff1f;或是想要在家就…

社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍

系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料&#xff0c;加入兴趣围子&#xff0c;通过文字、图片、语音、视频等多种方式进行交流&#xff0c;满足用户在不同场景下的社交需求 核心功能 -&#xff0c;…

Matlab编程资源库(1)选择结构

一、if语句 在 MATLAB 中&#xff0c; if 语句有 3 种格式。 (1) 单分支 if 语句&#xff1a; if 条件 语句组 end 当条件成立时&#xff0c;则执行语句组&#xff0c;执行完之后&#xff0c; 继续执行 if 语句的后继语句&#xff0c;若条件不成 立&#xff0c;则直接执…

Qt源码交叉编译带openssl的Qt版本

一.背景 近期项目由于对接的后台服务是https的&#xff0c;之前交叉编译的Qt是不带openssl的&#xff0c;为了能支持https&#xff0c;必须要重新编译Qt。 二.环境 环境准备&#xff1a; Ubuntu版本 &#xff1a;18.04&#xff1b; openssl 版本&#xff1a;1.1.1.g&#xff1b…

C/C++的堆栈内存分配详解

在C/C编程中&#xff0c;内存管理是至关重要的一个方面。理解内存的分配方式有助于编写高效、可靠的程序&#xff0c;C/C主要使用两种内存分配方式&#xff1a;堆&#xff08;heap&#xff09;和栈&#xff08;stack&#xff09;。这两者在管理方式、性能和使用场景上都有显著区…

python计算PMF、PDF、CDF、PPF、KDE介绍

目录 1. 总括1.1 绘图示例1.2 概念介绍1. PMF (Probability Mass Function)2. PDF (Probability Density Function)3. CDF (Cumulative Distribution Function)4. PPF (Percent Point Function)5. KDE (Kernel Density Estimation)1. 总括 1.1 绘图示例 上图展示了PMF、PDF、C…

物联网精密空调监控指标解读:松越_TCP7022EX_精密空调

监控易是一款专业的IT和物联网设备监控软件&#xff0c;能够实时监控各类IT资源和物联网设备的运行状态&#xff0c;确保系统的稳定运行。在物联网精密空调领域&#xff0c;监控易对松越_TCP7022EX_精密空调进行了全面的监控&#xff0c;以下是对其监控指标的详细解读。 监控指…

天工Godwork AT 5.2.6 GodWork2D 2.1.5 GodWork EOS 2.1实景三维建模软件

天工Godwork AT 5.2.6/GodWork2D 2.1.5/GodWork EOS 2.1实景三维建模软件 获取安装包联系邮箱:2895356150qq.com 本介绍用于学习使用&#xff0c;如有侵权请您联系删除&#xff01; 1.自主研发的平差技术&#xff0c;平差模块不依赖PATB、Bingo等国外技术 2.采用特征匹配&…

华媒舍:6个媒体宣发套餐,快速突破传播界限

在当今信息爆炸的社会中&#xff0c;有效地传播自己的信息变得愈发困难。特别是对于媒体宣发来说&#xff0c;如何在市场竞争激烈的情况下突破传播界限&#xff0c;让自己的消息传达给更多的人&#xff0c;这是每个企业和个人都面临的难题。 为了解决这个问题&#xff0c;我们推…

libtins初探-抓包嗅探

libtin 一、概述1. 可移植性2. 特性 二、基础知识1. PDU2. 地址类3. 地址范围类4. 网络接口5. 写pcap文件 三、嗅探1.嗅探基础2. 嗅探器配置3. 循环嗅探4. 使用迭代器嗅探6. 包对象7. 读取pcap文件8. 包的解析 四、发送包1. 发送网络层pdu2. 发送链路层pdu3. 发送和接收响应校验…

【QT】常用控件(概述、QWidget核心属性、按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)

一、控件概述 Widget 是 Qt 中的核心概念&#xff0c;英文原义是 “小部件”&#xff0c;此处也把它翻译为 “控件”。控件是构成一个图形化界面的基本要素。 像上述示例中的按钮、列表视图、树形视图、单行输入框、多行输入框、滚动条、下拉框都可以称为 “控件”。 Qt 作为…

数学建模学习(1)遗传算法

一、简介 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种用于解决优化和搜索问题的进化算法。它基于自然选择和遗传学原理&#xff0c;通过模拟生物进化过程来寻找最优解。 以下是遗传算法的主要步骤和概念&#xff1a; 初始化种群&#xff08;Initialization&a…

pytest实战技巧之参数化应用

pytest是Python中最流行的测试框架之一。它提供了丰富的功能&#xff0c;可以帮助我们编写高效、可靠的测试用例。其中一个重要的功能就是参数化&#xff0c;它可以让我们用不同的数据组合来运行同一个测试用例&#xff0c;从而 提高测试覆盖率和效率。本文将介绍pytest参数化的…

微软蓝屏事件:全球IT基础设施的韧性考验与未来展望

在数字化时代&#xff0c;信息技术的飞速发展极大地推动了社会进步与产业升级&#xff0c;但同时也让全球IT基础设施的韧性与安全性面临着前所未有的挑战。近日&#xff0c;一场由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅震撼了整个科技界&#xff0…

“微软蓝屏”事件引发的深度思考:网络安全与系统稳定性的挑战与应对

“微软蓝屏”事件暴露了网络安全哪些问题&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全…

数据结构中的八大金刚--------八大排序算法

目录 引言 一&#xff1a;InsertSort(直接插入排序) 二&#xff1a;ShellSort(希尔排序) 三&#xff1a;BubbleSort(冒泡排序) 四&#xff1a; HeapSort(堆排序) 五&#xff1a;SelectSort(直接选择排序) 六&#xff1a;QuickSort(快速排序) 1.Hoare版本 2.前后指针版本 …

学成在线开心学习

环境配置 第一章 项目介绍&环境搭建 项目背景 项目业务框架 项目技术架构 第二章 内容管理模块 本项目使用mybatis-plus的generator工程生成PO类、Mapper接口、Mapper的xml文件 模块工程 模型类的作用 课程查询接口 controller ApiOperation("课程查询接口&qu…

二、【Python】入门 - 【PyCharm】安装教程

往期博主文章分享文章&#xff1a; 【机器学习】专栏http://t.csdnimg.cn/sQBvw 目录 第一步&#xff1a;PyCharm下载 第二步&#xff1a;安装&#xff08;点击安装包打开下图页面&#xff09; 第三步&#xff1a;科学使用&#xff0c;请前往下载最新工具及教程&#xff1a…

【安卓开发】【Android】如何进行真机调试【注意事项】

一、所需原料 1、电脑&#xff08;安装有Android Studio开发工具&#xff09;&#xff1a; 2、安卓操作系统手机&#xff1a;笔者演示所用机型为huawei rongyao50&#xff0c;型号为NTU-AN00&#xff1a; 3、数据线&#xff08;usb-typeA&#xff09;一根。 二、操作步骤 1…