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.xdnf.cn/news/1487282.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于ansible进行运维自动化的研究以及相关的属性

一、ansible-简介 介绍 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c; 实现了批量系统配置、批量程序部署、批量运行命令等功能。 无客户端。 …

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp直接访问安装就行 …

音频处理过程

1、音频 &#xff08;1&#xff09;打开设备 &#xff08;2&#xff09;从音频设备中读取数据 &#xff08;3&#xff09;将音频设备中读取的数据写入文件夹中 &#xff08;4&#xff09; 通过界面控制开始录制和结束录制&#xff08;使用多线程和状态码控制&#xff09; &…

C++与C中,由函数形参test(int *a)引出的问题

文章参考来源&#xff1a; 1.c函数中形参为引用的情况&#xff1b;C中a和&a的区别 描述&#xff1a; 最近在看循环单链表时&#xff0c;看到有篇文章中&#xff0c;链表初始化函数为图下&#xff0c;我在想&#xff0c;这个函数形参(类似 "int * & a"一样)到…

【C# WInForm】将TextBox从输入框设置为文本框

1.需求情形&#xff1a; textbox作为最常用的控件之一&#xff0c;通常是用来输入文本信息或者显示文字&#xff0c;但是如果要在界面中显示大段文本&#xff0c;一个带有边框、可选中的文本样式似乎不合适。像这样&#xff1a; 我需要的是这段文字不仅能跨行&#xff0c;而且…

Geoserver介绍与安装

Geoserver简介 概览 GeoServer是一个使用Java编写的&#xff0c;允许用户分享、编辑地理空间数据的开源软件。它在设计时就考虑了互操作性&#xff0c;其支持使用开放标准发布多数主流格式的空间数据。 作为一个社区驱动的项目&#xff0c;GeoServer由来自世界各地的个人和组…

记一次因敏感信息泄露而导致的越权+存储型XSS

1、寻找测试目标 可能各位师傅会有苦于不知道如何寻找测试目标的烦恼&#xff0c;这里我惯用的就是寻找可进站的思路。这个思路分为两种&#xff0c;一是弱口令进站测试&#xff0c;二是可注册进站测试。依照这个思路&#xff0c;我依旧是用鹰图进行了一波资产的搜集&#xff…

HTTP模块(二)

HTTP 设置 HTTP 响应报文 HTTP报文常见属性&#xff1a; const http require(http);const server http.createServer((request, response) > {// 设置请求状态码 2xx 4xx 5xxresponse.statusCode 200;// 设置请求描述 了解即可response.statusMessage hello// 指定响…

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建&#xff0c;即 vue create projectName 但是官方更推荐 vite 创建&#xff0c;即 npm create vuelatest&#xff0c;然后从项目名开始配置 总结&#xff1a;入口在 index.html&#xff0c;它会引入 main.ts&#xff0c;…

怎么把mac文件拷贝到移动硬盘 Mac拷贝之后Win电脑里看不到 mac拷贝windows文件时出错

Mac文件拷贝到移动硬盘怎么做&#xff1f;文件拷贝实际上是将文件写入磁盘中&#xff0c;因此&#xff0c;Mac系统需要具备写入磁盘的功能与权限&#xff0c;否则无法进行操作。如果出现Mac拷贝之后Win电脑里看不到的问题&#xff0c;很可能是写入功能受限导致的。本文会给大家…

昇思25天学习打卡营第3天 | 张量

张量是现代机器学习框架中的核心数据结构&#xff0c;理解张量的工作方式是深入掌握深度学习和神经网络的基础。 张量的基本概念 张量是一个多维数组&#xff0c;它是标量、向量和矩阵的高维推广。在MindSpore和其他深度学习框架中&#xff0c;张量是存储和操作数据的主要形式…

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

【Linux】通过分配虚拟内存的方式来解决因内存不够而导致部署的项目自动挂掉

多个 jar 包项目部署在同一台服务器上&#xff0c;当服务器配置低&#xff0c;内存不足时&#xff0c;有可能出现 nohup java -jar 启动的进程就莫名其妙挂掉的问题。 解决方式&#xff1a; 第一种方法&#xff1a;进行JVM调优可以改善这种情况&#xff0c;但是项目太多&…

【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技&#xff1a;Laravel 项目性能提升 20 倍 这个项目能够在无需修改任何代码且无需第三方扩展的前提下&#xff0c;将你的 Laravel 项目性能提高 20 倍。它仅依赖于 PHP 原生的 pcntl、posix、fiber 和 sockets。 项目灵感 起因是看到官方发布的 PHP 8.1 更新…

网闸(Network Gatekeeper或Security Gateway)

本心、输入输出、结果 文章目录 网闸(Network Gatekeeper或Security Gateway)前言网闸主要功能网闸工作原理网闸使用场景网闸网闸(Network Gatekeeper或Security Gateway) 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助…

【Stable Diffusion】(基础篇四)—— 模型

模型 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲解如何下载和使…

SQUID - 形状条件下的基于分子片段的3D分子生成等变模型 评测

SQUID 是一个形状条件下基于片段的3D分子生成模型&#xff0c;给一个3D参考分子&#xff0c;SQUID 可以根据参考分子的形状&#xff0c;基于片段库&#xff0c;生成与参考分子形状非常相似的分子。 SQUID 模型来自于 ICLR 2023 文章&#xff08;2022年10月6日提交&#xff09;&…

【Python】一文向您详细介绍 K-means 算法

【Python】一文向您详细介绍 K-means 算法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff…

华盈生物-ESQ外泌体快速标记试剂盒

外泌体&#xff08;exosomes&#xff09;作为细胞间通信的重要载体&#xff0c;已经在癌症研究、神经退行性疾病研究和免疫学等领域引起了广泛关注。外泌体的研究通常需要对其进行标记和检测&#xff0c;但传统方法如超速离心不仅耗时且复杂&#xff0c;还可能导致外泌体损失和…