Gson的常见用法

news/2024/6/30 19:08:13

一引入依赖

<!-- json解析的工具包 -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>
<!-- 主要为了代码简洁和日志打印 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version> 
</dependency>

二用到的测试实体(不需要序列化和反序列化的字段用transient声明)

@Data
@AllArgsConstructor
public class Student implements Serializable,Cloneable {

    private static final long serialVersionUID = 6447932156561222739L;
    private Integer sNo;
    private String name;
    private Date birthday;
    private Integer classNo;
    private String grade;

    /**
     * 方便对象复制
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Student clone() throws CloneNotSupportedException {
        return (Student) super.clone();
    }
}

三转json字符串(序列化)

方便使用,我在测试类将Gson设置为全局变量
在这里插入图片描述

private static final Gson GSON = new Gson();
  1. 对象序列化

 Student s1 = new Student(1,"张三",new Date(),1001,"一年级");
 String s1Json = GSON.toJson(s1);
 log.info("Gson将Student转的json为{}",s1Json);

测试结果:
Gson将Student转的json为{“sNo”:1,“name”:“张三”,“birthday”:“Jun 16, 2024 11:14:35 AM”,“classNo”:1001,“grade”:“一年级”}

  1. Map容器序列化(如果Map序列化对数据顺序有要求,可以使用LinkedHashMap)

Student s1 = new Student(1,"张三",new Date(),1001,"一年级");
Student s2 = s1.clone();
s2.setSNo(2);
Student s3 = s1.clone();
s3.setSNo(3);
Student s4 = s1.clone();
s4.setSNo(4);
Map<String,Student> data = new LinkedHashMap();
data.put("s1",s1);
data.put("s2",s2);
data.put("s3",s3);
data.put("s4",s4);
String mapJson = GSON.toJson(data);
log.info("Gson将map转的json为{}",mapJson);

测试结果:
Gson将map转的json为{“s1”:{“sNo”:1,“name”:“张三”,“birthday”:“Jun 16, 2024 11:14:35 AM”,“classNo”:1001,“grade”:“一年级”},“s2”:{“sNo”:2,“name”:“张三”,“birthday”:“Jun 16, 2024 11:14:35 AM”,“classNo”:1001,“grade”:“一年级”},“s3”:{“sNo”:3,“name”:“张三”,“birthday”:“Jun 16, 2024 11:14:35 AM”,“classNo”:1001,“grade”:“一年级”},“s4”:{“sNo”:4,“name”:“张三”,“birthday”:“Jun 16, 2024 11:14:35 AM”,“classNo”:1001,“grade”:“一年级”}}

  1. List容器序列化

Student s1 = new Student(1,"张三",new Date(),1001,"一年级");
Student s2 = s1.clone();
s2.setSNo(2);
Student s3 = s1.clone();
s3.setSNo(3);
Student s4 = s1.clone();
s4.setSNo(4);
List<Student> studentList = new ArrayList<>(Arrays.asList(s1,s2,s3,s4));
String listJson = GSON.toJson(studentList);
log.info("Gson将List转的json为{}",listJson);

四json转对象(反序列化)

  1. json转实体,以上面Student为例

Student s1 = new Student(1,"张三",new Date(),1001,"一年级");
String s1Json = GSON.toJson(s1);
log.info("Gson将Student转的json为{}",s1Json);
Student json1Student = GSON.fromJson(s1Json,Student.class);
log.info("json转实体Student结果:{}",json1Student);

测试结果:
json转实体Student结果:Student(sNo=1, name=张三, birthday=Sun Jun 16 11:14:35 CST 2024, classNo=1001, grade=一年级)

  1. json转Map

Student s1 = new Student(1,"张三",new Date(),1001,"一年级");
String s1Json = GSON.toJson(s1);
Student s2 = s1.clone();
s2.setSNo(2);
Student s3 = s1.clone();
s3.setSNo(3);
Student s4 = s1.clone();
s4.setSNo(4);

Map<String,Student> data = new LinkedHashMap();
data.put("s1",s1);
data.put("s2",s2);
data.put("s3",s3);
data.put("s4",s4);

String mapJson = GSON.toJson(data);
log.info("Gson将map转的json为{}",mapJson);

Map<String,Student> json2map = GSON.fromJson(mapJson,Map.class);
log.info("json转Map结果:{}",json2map);

测试结果:
json转Map结果:{s1={sNo=1.0, name=张三, birthday=Jun 16, 2024 11:14:35 AM, classNo=1001.0, grade=一年级}, s2={sNo=2.0, name=张三, birthday=Jun 16, 2024 11:14:35 AM, classNo=1001.0, grade=一年级}, s3={sNo=3.0, name=张三, birthday=Jun 16, 2024 11:14:35 AM, classNo=1001.0, grade=一年级}, s4={sNo=4.0, name=张三, birthday=Jun 16, 2024 11:14:35 AM, classNo=1001.0, grade=一年级}}

  1. json转List

Student s1 = new Student(1,"张三",new Date(),1001,"一年级");
Student s2 = s1.clone();
s2.setSNo(2);
Student s3 = s1.clone();
s3.setSNo(3);
Student s4 = s1.clone();
s4.setSNo(4);

List<Student> studentList = new ArrayList<>(Arrays.asList(s1,s2,s3,s4));
String listJson = GSON.toJson(studentList);
log.info("Gson将List转的json为{}",listJson);

Type listType = new TypeToken<ArrayList<Student>>(){}.getType();
List<Student> json2List = GSON.fromJson(listJson,listType);
log.info("json转List结果:{}",json2List);

测试结果:
json转List结果:[Student(sNo=1, name=张三, birthday=Sun Jun 16 11:14:35 CST 2024, classNo=1001, grade=一年级), Student(sNo=2, name=张三, birthday=Sun Jun 16 11:14:35 CST 2024, classNo=1001, grade=一年级), Student(sNo=3, name=张三, birthday=Sun Jun 16 11:14:35 CST 2024, classNo=1001, grade=一年级), Student(sNo=4, name=张三, birthday=Sun Jun 16 11:14:35 CST 2024, classNo=1001, grade=一年级)]


http://lihuaxi.xjx100.cn/news/2215579.html

相关文章

三生随记——茶叶的诅咒

在遥远的深山中&#xff0c;有一个被浓雾常年笼罩的古村落。这里的人们生活简朴&#xff0c;与外界几乎隔绝&#xff0c;他们唯一的财富&#xff0c;便是那满山遍野的奇特茶叶。这种茶叶的叶片深绿如玉&#xff0c;散发着诱人的香气&#xff0c;被称为“幽雾灵茶”。 然而&…

Opencv无法自动补全

执行下面两条命令&#xff1a; 特别说明: 即使能补全了&#xff0c;但是还是有弊端&#xff0c;写参数的时候没有参数的候选项&#xff0c;所以相当于只能补全个函数名&#xff0c;谁有更好的解法&#xff0c;恳求留言告知。 参考1&#xff1a;https://blog.csdn.net/yuezhilan…

QT 使用资源文件的注意点

不要存放没有使用的资源文件 即使在代码中没有使用到的资源文件&#xff0c;也会编译到执行文件或者DLL里面去这样会增大它的体积。如下 在代码没有使用这个资源文件(10.4M的2k图片)&#xff0c;但是编译出来的程序有 12M左右的大小

第三篇—基于黑白样本的webshell检测

本篇为webshell检测的第三篇&#xff0c;主要讲的是基于黑白样本的webshell预测&#xff0c;从样本收集、特征提取、模型训练&#xff0c;最后模型评估这四步&#xff0c;实现一个简单的黑白样本预测模型。   若有误之处&#xff0c;望大佬们指出 Ⅰ 基本实现步骤 样本收集&…

Python 学习 第二册 第11章 文件

----用教授的方式学习 目录 11.1 打开文件 11.2 文件的基本方法 11.2.1 读取和写入 11.2.2 使用管道重定向输出 11.2.3 读取和写入行 11.2.4 关闭文件 11.3 迭代文件内容 11.3.1 每次一个字符&#xff08;或字节&#xff09; 11.3.2 每次一行 11.3.3 读取所有内容 …

python flask配置邮箱发送功能,使用flask_mail模块

&#x1f308;所属专栏&#xff1a;【Flask】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

Mac vscode could not import github.com/gin-gonic/gin

问题背景&#xff1a; 第一次导入一个go的项目就报红 问题分析&#xff1a; 其实就是之前没有下载和导入gin这个web框架包 gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确。 问题解决&#xff1a; 依次输入以下命令。通…

【Echarts系列】水平柱状图

【Echarts系列】水平柱状图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 水平柱状图如图所示&#xff1a; 数据格式 data [{name: 于洪区,value: 2736},{name: 新民市,value: 2844},{name: 皇姑区,…