Gson

1.简介
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象(反序列化),或者反过来(序列化)。
在bulid.gradle中添加依赖
implementation 'com.google.code.gson:gson:2.10.1'
2.Java对象序列化与反序列化
使用new Gson().toJson/fromJson即可完成序列化与反序列化。
@Testpublic void testObject() {//java对象User user = new User("a404","123456",18,false);//Gson对象Gson gson = new Gson();//序列化String json = gson.toJson(user);System.out.println("序列化:"+ json);//反序列化User user1 = gson.fromJson(json,User.class);System.out.println("反序列化:"+ user1.toString());}
3.Java嵌套对象序列化与反序列化

User类中增加字段:Job(name,salary),对User类型对象进行序列化与反序列化。

@Testpublic void testNestedObject() {User user2 = new User("a404","123456",21,false);Job job = new Job("jerry",5000);user2.setJob(job);Gson gson = new Gson();String json = gson.toJson(user2);System.out.println(json);User user3 = gson.fromJson(json,User.class);System.out.println(user3.getUsername()+user3.getJob());}

输出显示是否有嵌套对象不影响序列化与反序列化

4.Array数组的序列化与反序列化
数组类型对象和普通对象一样,使用toJson/fromJson即可完成序列化与反序列化。
@Testpublic void arrayTest() {User[] users = new User[3];users[0] = new User("a1","123",17,true);users[1] = new User("a2","456",21,false);Gson gson = new Gson();String json = gson.toJson(users);System.out.println("序列化:"+json);User[] users1 = gson.fromJson(json,User[].class);System.out.println("反序列化:"+users1);System.out.printf("反序列化1:"+users1[0]);System.out.println("反序列化2:"+users1[1]);System.out.println("反序列化3:"+users1[2]);}
5.List的序列化与反序列化
List集合类型对象需要注意的是,在反序列化时因为Java是伪泛型,泛型擦除会导致无法反序列化为List<User>,需要使用TypeToken完成反序列化。
@Testpublic void listTest() {List<User> list = new ArrayList<>();list.add(new User("a1","1",7,true));list.add(new User("a2","2",8,false));list.add(null);Gson gson = new Gson();String json = gson.toJson(list);Type type = new TypeToken<List<User>>() {}.getType();List<User> list1 = gson.fromJson(json,type);System.out.println("反序列化:"+list1);System.out.println("反序列化:"+list1.get(0).getUsername());System.out.println("反序列化:"+list1.get(1));System.out.println("反序列化:"+list1.get(2));}
6.Map的序列化与反序列化
Map集合类型对象在反序列化时与List一样,需要使用TypeToken完成反序列化。
@Testpublic void testMap() {Map<String, User> map = new HashMap<>();map.put("1",new User("b","11",18,false));map.put("2",new User("c","22",25,true));map.put("3",null);map.put(null,null);Gson gson = new Gson();String json =gson.toJson(map);System.out.println("序列化:"+json);Type type = new TypeToken<Map<String, User>>() {}.getType();Map<String,User> map1 = gson.fromJson(json,type);System.out.println("反序列化:"+map1.get(null));System.out.println("反序列化:"+map1.get("1"));}
7.Set的序列化与反序列化
Set在反序列化时同样需要使用TypeToken完成反序列化。
@Testpublic void testSet() {Set<User> set = new HashSet<>();set.add(new User("b","11",18,false));set.add(new User("c","22",25,true));set.add(null);Gson gson = new Gson();String json = gson.toJson(set);System.out.println("序列化:"+json);Type type = new TypeToken<Set<User>>(){}.getType();Set<User> set1 = gson.fromJson(json,type);Iterator<User> iterator = set1.iterator();while (iterator.hasNext()){User next = iterator.next();System.out.println("反序列化:"+next);}
//如果HashSet类型,则完全可以使用反序列为List,因为两者序列化后的Json数据一致
//        Type type =new TypeToken<List<User>>(){}.getType();
//        List<User> list = gson.fromJson(json,type);
//        System.out.println("反序列化:"+list.get(0));
//        System.out.println("反序列化:"+list.get(1));
//        System.out.println("反序列化:"+list.get(2));}
8.NULL的序列化与反序列化
如果一个变量为NULL,那么按照GSON默认的处理为忽略这个字段
@Testpublic void testNull() {User user = new User("d","55",6,false);Gson gson = new Gson();String json = gson.toJson(user);System.out.println(json);User user1 = gson.fromJson(json,User.class);System.out.println(user1);System.out.println(user1.getJob());}序列化{"username":"d","password":"55","age":6,"isStudent":false}
反序列化User{username='d', password='55', age=6, isStudent=false, job=null}
9.控制序列化/反序列化的变量名称
如果希望JSON字符串字段名不以变量名作为Key,比如JSON字符串中的Key存在Java中的关键字时,可以借助@SerializedName注解控制JSON字段中Key的命名。
@Expose//无法以class作为字段名@SerializedName("class")private int cls;{"userName":"a","password":"123","age":18,"isStudent":false,"class":2}
如果希望指定GSON对某些字段配置是否参与序列化与反序列化,可以使用 @Expose 注解控制,同时使用GsonBuilder创建Gson对象:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();//serialize:是否参与序列化,deserialize是否参与反序列化@Expose(serialize = false, deserialize = false)private int test1;
另外transient关键字,也可以直接让变量不参与序列化/反序列化
private transient int test2;

详细请参考

gson/UserGuide.md at main · google/gson (github.com)

com.google.gson (Gson 2.10.1 API) (javadoc.io)

google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back (github.com)

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

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

相关文章

LinkedList用法详解(Java)

LinkedList LinkedList 是 Java 中的一个常用类&#xff0c;它实现了 List 接口&#xff0c;采用双向链表数据结构。 1. 创建 LinkedList 对象 import java.util.LinkedList;LinkedList<String> linkedList new LinkedList<>();2. 添加元素 linkedList.add(&q…

单调栈和单调队列所学的一些问题

单调栈和单调队列所学的一些问题 单调栈 单调栈中的元素要求从栈底到栈顶单调递增 遍历数组&#xff0c;如果元素入栈后符合单调要求则顺利入栈不符合要求则弹出栈顶元素&#xff0c;元素出栈时得出结果 右侧结果:待入栈元素 左侧结果:出栈后的栈顶元素 单调栈主要用来求每一…

OpenHarmony实战开发-如何使用Web预渲染实现功能介绍。

介绍 为了便于大家在使用本案例集时能够更详细的了解各个案例&#xff0c;本案例基于Web预渲染实现了案例介绍功能&#xff0c;即应用右下角的问号icon。 效果图预览 使用说明 因为直接加载的线上README&#xff0c;因此本功能需联网使用点击icon&#xff0c;即会弹出对应案…

爬虫的目的是做什么

通过网站域名获取HTML数据解析数据&#xff0c;获取想要的信息存储爬取的信息如果有必要&#xff0c;移动到另一个网页重复过程 这本书上的代码的网址是 &#xff1a; GitHub - REMitchell/python-scraping: Code samples from the book Web Scraping with Python http://shop.…

.NET使用Refit

学习笔记&#xff1a; Refit 是一个 .NET Standard 库,它可以自动生成用于调用 REST API 的强类型客户端。根据 REST API 的定义,自动生成用于调用 API 的客户端类和方法&#xff0c;支持 GET、POST、PUT、DELETE 等常见的 HTTP 方法&#xff0c;且自动处理 HTTP 请求和响应,包…

风力发电场集中监控系统解决方案

风力发电场集中监控系统解决方案 作为清洁能源之一&#xff0c;风力发电场近几年装机容量快速增长。8月17日&#xff0c;国家能源局发布1-7月份全国电力工业统计数据。截至7月底&#xff0c;全国累计发电装机容量约27.4亿千瓦&#xff0c;同比增长11.5%。其中&#xff0c;太阳能…

火绒安全的用法

火绒安全软件是一款综合性的电脑安全防护工具&#xff0c;提供了病毒查杀、系统防护、网络安全等多种功能&#xff0c;以帮助用户保护电脑免受恶意软件和网络威胁的侵害。以下是火绒安全软件的一些主要用法&#xff1a; 病毒查杀&#xff1a;火绒安全软件提供全盘查杀、快速查杀…

[STM32+HAL]DengFOC移植之闭环位置控制

一、源码来源 DengFOC官方文档 二、HAL库配置 1、开启硬件IIC低速模式 低速更稳定 2、PWM波开启 三、keil填写代码 1、AS5600读取编码器数值 #include "AS5600.h" #include "math.h"float angle_prev0; int full_rotations0; // full rotation trac…

hive窗口函数数据范围

window的内包括&#xff1a; (ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING) (ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING) (ROWS | RANGE) BETWEEN…

前端面试题(小整理)

vue中的生命周期钩子有哪些 beforeCreate&#xff1a; 在实例初始化之后&#xff0c;数据观测 (data observer) 和事件配置 (event/watcher setup) 之前被调用。 在此阶段&#xff0c;实例的属性和方法还未初始化。 created&#xff1a; 在实例创建完成后被立即调用。 可以访问…

文心一言VSchatGPT4

文心一言和GPT-4各有优势&#xff0c;具体表现在不同的测试场景下。 在某些测试场景中心一言的表现优于GPT-4&#xff0c;例如在故事的完整度和情节吸引力方面&#xff0c;文心一言表现得更加符合指令&#xff0c;情节更吸引人。这可能得益于其模型在训练时对中文语境的深入理…

选择电源自动化测试系统,要考虑哪些因素?

随着科技的发展以及市场需求的变化&#xff0c;手动测试以及传统自动化测试不足日益明显&#xff0c;已无法满足当前的电源测试需求&#xff0c;因此&#xff0c;选择全新的自动化测试系统成为必然趋势。那么&#xff0c;要如何选择可靠、高效的电源自动化测试系统呢&#xff1…

计算机网络——网络地址转换(NAT)技术

目录 前言 前篇 引言 SNAT&#xff08;Source Network Address Translation&#xff09;源网络地址转换 SNAT流程 确定性标记 DNAT&#xff08;Destination Network Address Translation&#xff0c;目标网络地址转换&#xff09; NAT技术重要性 前言 本博客是博主用于…

15 Python进阶: random和pyecharts

Python random 模块主要用于生成随机数。 random 模块实现了各种分布的伪随机数生成器。 要使用 random 函数必须先导入&#xff1a; import randompython random 模块的一般用法 Python中的random模块提供了生成伪随机数的功能&#xff0c;可以用于模拟、游戏开发、密码学…

【Spring Boot 源码学习】SpringApplication 的 run 方法核心流程介绍

《Spring Boot 源码学习系列》 SpringApplication 的 run 方法核心流程介绍 一、引言二、往期内容三、主要内容3.1 run 方法源码初识3.2 引导上下文 BootstrapContext3.3 系统属性【java.awt.headless】3.4 早期启动阶段3.5 准备和配置应用环境3.6 打印 Banner 信息3.7 新建应用…

TCP 粘包

从应用层到 TCP 传输层的多个数 据包是一连串的字节流是没有边界的&#xff0c;而且 TCP 首部并没有记录数据包的长度&#xff0c;所以 TCP 传输数据的时候可能会发送粘包和拆包的问题&#xff1b;而 UDP 是基于数据报传输数据的&#xff0c;UDP 首部也记录了数据报的长度&…

Blender表面细分的操作

在使用Blender的过程中,刚开始创建的模型,都会比较少面,这样操作起来比较流畅,减少电脑的计算量,当设计快要完成时,就会增加表面细分,这样更加圆滑,看起来更加顺眼。 比如创建一个猴头,它会默认显示如下: 从上图可以看到,有一些表面会比较大,棱角很多。 这时候你…

java声明一个日期类MyDate

声明一个日期类MyDate&#xff0c;包含如下方法&#xff1a; * - boolean isLeapYear()&#xff1a;判断是否是闰年 * - String monthName()&#xff1a;根据月份值&#xff0c;返回对应的英语单词 * - int totalDaysOfMonth()&#xff1a;返回这个月的总天数 * - int totalDay…

win11如何重新安装应用商店,怎么重装应用商店

win11系统内置了应用商店&#xff0c;相当于手机的应用商城&#xff0c;用户们想要下载软件时&#xff0c;就会前往应用商店搜索下载。如果我们因为误操作&#xff0c;删除了win11应用商店&#xff0c;或者是应用商店出现闪退、卡顿等问题&#xff0c;这个时候&#xff0c;最好…

插值算法-代码实现

1、 import java.util.HashMap; import java.util.Map;public class Interpolation {public static void main(String[] args) {// 定义给定的 XML 字段值Map<String, double[]> xmlValues new HashMap<>();xmlValues.put("faceSize", new double[]{10…