Gson是Java序列化/反序列化库,用于将 Java 对象转换为JSON并返回。 Gson由Google创建,供内部使用,后来开源。
Gson具有三种API:数据绑定 API、树模型 API、流 API
数据绑定 API 使用属性访问器将JSON与POJO之间进行转换。 Gson使用数据类型适配器处理 JSON 数据。 它类似于XML JAXB解析器。
树模型 API创建JSON 文档的内存树表示。 它构建JsonElements的树。 它类似于XML DOM解析器。
流 API是一种低级 API,它使用JsonReader和JsonWriter作为离散记号读取和写入 JSON 内容。 这些类将数据读取为JsonTokens。 该 API 具有最低的开销,并且在读/写操作中速度很快。 它类似于 XML 的 Stax 解析器
添加对Gson的Maven依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<
version>2.9.0</version>
</dependency>
Gson是使用Gson库的主要类
toJson()方法将指定的对象序列化为其等效的JSON表示形式
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
Gson gson = new Gson();
String output = gson.toJson(map);
System.out.println(output);
{"1":"a","2":"b","3":"c"}
fromJson()方法将JSON读取到Java对象中
public static void main(String[] args) {
String json_string = "{\"username\":\"Jack\", \"age\": \"20\"}";
Gson gson = new Gson();
User user = gson.fromJson(json_string, User.class);
System.out.println(user);
@ToString
@AllArgsConstructor
class User {
private String username;
private String age;
GsonBuilder可使用各种配置设置构建Gson。GsonBuilder遵循构建器模式,通常通过首先调用各种配置方法来设置所需的选项,最后调用create()来使用它。
public static void main(String[] args) throws UnsupportedEncodingException {
try (PrintStream prs = new PrintStream(System.out, true, "UTF8")) {
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.create();
User user = new User("Jack", 20);
gson.toJson(user, prs);
@ToString
@AllArgsConstructor
static
class User {
private String username;
private Integer age;
{"Username":"Jack","Age":20}
将JSON数据写入一个json文件。
public static void main(String[] args) throws IOException {
String filePath = "src/main/resources/users.json";
try (FileOutputStream fos = new FileOutputStream(filePath);
OutputStreamWriter isr = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
Gson gson = new Gson();
User user1 = new User("Jack", 23);
User user2 = new User("Jon", 22);
User user3 = new User("Tom", 33);
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
gson.toJson(users, isr);
将json文件中的JSON数据读取到数组中,并打印到控制台。
public static void main(String[] args) throws IOException {
String filePath = "src/main/resources/users.json";
Path path = new File(filePath).toPath();
try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
User[] users = new Gson().fromJson(reader, User[].class
);
Arrays.stream(users).forEach(e -> System.out.println(e));
ApplicationTests.User(username=Jack, age=23)
ApplicationTests.User(username=Jon, age=22)
ApplicationTests.User(username=Tom, age=33)
public static void main(String[] args) throws IOException {
String url = "xxx";
try (InputStream is = new URL(url).openStream();
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
Gson gson = new Gson();
User user = gson.fromJson(reader, User.class);
System.out.println(user);
Gson 有两种输出模式:紧凑和漂亮。通过setPrettyPrinting()方法设置漂亮的打印模式。
public static void main(String[] args) {
Gson gson1 = new GsonBuilder().create();
Gson gson2 = new GsonBuilder().setPrettyPrinting().create();
Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
gson1.toJson(map, System.out);
System.out.println("");
gson2.toJson(map, System.out);
{"1":"a","2":"b","3":"c"}
"1": "a",
"2": "b",
"3": "c"
默认情况下,Gson 不会将具有空值的字段序列化为 JSON。 如果 Java 对象中的字段为null,则 Gson 会将其排除。 我们可以使用serializeNulls()方法强制 Gson 通过 GsonBuilder 序列化null值。
public static void main(String[] args) {
Gson gson1 = new GsonBuilder().create();
Gson gson2 = new GsonBuilder().serializeNulls().create();
User user = new User("Jack", null);
System.out.println(gson1.toJson(user));
System.out.println(gson2.toJson(user));
{"username":"Jack"}
{"username":"Jack","age":null}
@Expose注解指定那些成员公开以进行JSON序列化或反序列化
@Expose注解可以采用两个布尔参数:serialize和deserialize进行控制
必须使用excludeFieldsWithoutExposeAnnotation()方法显式启用@Expose注解
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
User user = new User("Jack", 23);
gson.toJson(user, System.out);
@ToString
@AllArgsConstructor
static
class User {
@Expose
private String username;
private Integer age;
{"username":"Jack"}
Jackson有三个核包,分别是 Streaming、Databid、Annotations,通过这些包可以方便的对 JSON 进行操作。
Streaming (opens new window)在 jackson-core 模块。 定义了一些流处理相关的 API 以及特定的 JSON 实现。
Annotations (opens new window)在 jackson-annotations 模块,包含了 Jackson 中的注解。
Databind (opens new window)在 jackson-databind 模块, 在 Streaming 包的基础上实现了数据绑定,依赖于 Streaming 和 Annotations 包。
jackson-databind依赖 jackson-core 和 jackson-annotations,所以可以只显示地添加jackson-databind依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>
jackson-databind</artifactId>
<version>2.11.4</version>
</dependency>
ObjectMapper是Jackson 库中最常用的一个类,使用它可以进行 Java 对象和JSON字符串之间快速转换
readValue() 方法:进行JSON 的反序列化操作,比如可以将字符串、文件流、字节流、字节数组等将常见的内容转换成 Java 对象。
writeValue() 方法:进行JSON 的序列化操作,可以将 Java 对象转换成 JSON 字符串。
ObjectMapper的工作原理是通过 Java Bean 对象的 Get/Set 方法进行转换时映射的,所以Java对象的 Get/Set方法尤为重要。
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("Jack", 20);
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
{"username":"Jack","age":20}
@Data
class User {
private String username;
private Integer age;
public User() {
public User(String username, Integer age) {
this.username = username;
this.age = age;
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"username\":\"Jack\", \"age\": \"20\"}";
User user = objectMapper.readValue(json, User.class);
System.out.println("user = " + user);
user = User(username=Jack, age=20)
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
String json = "[{\"username\":\"Jack\", \"age\": \"20\"},{\"username\":\"Tom\", \"age\": \"22\"}]";
List<User> userList = objectMapper.readValue(json, new TypeReference<List<User>>() {});
userList.forEach(System.out::print);
User(username=Jack, age=20)User(username=Tom, age=22)
JSON转Map适用于在没有一个明确的Java对象时十分实用
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"username\":\"Jack\", \"age\": \"20\"}";
Map<String, Object> userNmp = objectMapper.readValue(json, new TypeReference<Map>() {});
for (Map.Entry<String, Object> entry : userNmp.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
如果在进行JSON 转 Java对象时,JSON中出现 Java 类中不存在的属性,那么在转换时会遇到com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException
异常。
使用objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
配置可以忽略不存在的属性。
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"username\":\"Jack\", \"age\": \"20\",, \"test\": \"test\"}";
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
User user = objectMapper.readValue(json, User.class);
System.out.println("user = " + user);
开发中通常使用java.util.Date类或时间类java.time.LocalDateTime类(JDK8),两者在Jackson中的处理略有不同。
Date类型
@AllArgsConstructor
@NoArgsConstructor
@Data
class User {
private String username;
private Integer age;
private Date createTime;
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("Jack", 20, new Date());
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
User u = objectMapper.readValue(json, User.class);
System.out.println(u.toString());
未使用@JsonFormat
注解,可以正常的进行JSON的序列化与反序列化,但是JSON 中的时间是一个时间戳格式
{"username":"Jack","age":20,"createTime":1669690748654}
User(username=Jack, age=20, createTime=Tue Nov 29 10:59:08 CST 2022)
使用 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
{"username":"Jack","age":20,"createTime":"2022-11-29 10:56:28"}
User(username=Jack, age=20, createTime=Tue Nov 29 10:56:28 CST 2022)
LocalDateTime类型
注意:默认情况下进行 LocalDateTime 类的 JSON 转换会遇到报错。异常信息:com.fasterxml.jackson.databind.exc.InvalidDefinitionException
需要添加相应的数据绑定支持包。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.3</version>
</dependency>
定义 ObjectMapper 时通过 findAndRegisterModules() 方法来注册依赖。
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
User user = new User("Jack", 20, LocalDateTime.now());
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
User u = objectMapper.readValue(json, User.class);
System.out.println(u.toString());
{"username":"Jack","age":20,"createTime":"2022-11-29 11:02:32"}
User(username=Jack, age=20, createTime=2022-11-29T11:02:32)
@JsonIgnore:使用@JsonIgnore 可以忽略某个 Java 对象中的属性,它将不参与 JSON 的序列化与反序列化。
@JsonIgnore
private String username;
@JsonGetter:使用 @JsonGetter 可以在对 Java 对象进行 JSON 序列化时自定义属性名称。
private String username;
@JsonGetter(value = "myName")
public String getUsername() {
return username;
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("Jack", 20);
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
User u = objectMapper.readValue(json, User.class);
System.out.println(u.toString());
{"age":20,"myName":"Jack"}
User(username=Jack, age=20)
@JsonSetter:使用 @JsonSetter 可以在对 JSON 进行反序列化时设置 JSON 中的 key 与 Java 属性的映射关系。
@JsonSetter(value = "myName")
private String username;
public static void
main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
String json="{\"age\":20,\"myName\":\"Jack\"}";
User u = objectMapper.readValue(json, User.class);
System.out.println(u.toString());
User(username=Jack, age=20)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:
http://www.bryh.cn/a/169754.html
如若内容造成侵权/违法违规/事实不符,请联系七分地网email:809451989@qq.com进行投诉反馈,一经查实,立即删除!
文章目录前言一、IO引脚的基本概念二、映射层的设置1、映射层是原理图的直译层2、IO引脚的设置在hal.h 和 hal.cpp文件中完成(1)在hal.h中进行类定义(2)在hal.cpp中完成引脚映射三、面向对象程序设计思想1、程序设计分类2、举例3、…
阅读更多...
前言: vue 中组件间通信的方式有很多 ------ 父传子propos,全局事件总线,消息订阅,vuex......等等,这篇文章带大家学习一下通过全局事件总线来实现任意组件间的通信。 文章目录: 一:什么是全局…
阅读更多...
此命令里有很多内容值得一看。
https://www.ibm.com/docs/en/ibm-mq/8.0?topiccommands-define-authinfo#q085490___6
一,CHCKCLNT
CHCKCLNT
This attribute determines the authentication requirements for client applications, and is valid only for an A…
阅读更多...
婚纱代表着纯洁与忠贞,也是爱情永恒的见证者,穿上洁白的婚纱嫁给自己心爱的人是每个女生的梦想,婚纱对于每一个女生来说都有着重要的意义,所以选择一件美丽且适合的婚纱非常重要,因此人们在选择婚纱时会花费很多的时间…
阅读更多...
文章目录一. 单选1. 设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度()2. 在一个单链表中,若删除 P 所指结点的后续结点,则执行?3. 设一个链表最常用的…
阅读更多...
ubuntu安装配置mysql 提示:ubuntu版本16.0.4,默认安装的mysql版本为 5.7 提示:MYSQL的安装、配置:
ubuntu mysql的安装既可以使用命令直接安装,也可以安装包方式安装。本文主要介绍命令直接安装方式,包括安…
阅读更多...
目录1. 概念1. JWT 概述2. session认证流程2. JWT认证流程2. 使用JWT1. 获取令牌2. 验证令牌3. 封装工具类3. Springboot整合JWT1. 项目搭建2. 使用JWT3. 优化代码1. 概念 1. JWT 概述
JWT:
概念: 通过 JSON 形式作为 Web 应用中的令牌,用于…
阅读更多...
11月18日,2022年第五届中国金融科技产业大会暨第四届中新(苏州)数字金融应用博览会“基础软件与云原生系统软件”分论坛成功举办。该论坛由由中国计算机学会CTO CLUB(苏州)承办,江苏省金融科技云原生融合创…
阅读更多...
金磊 羿阁 发自 凹非寺量子位 | 公众号 QbitAI马斯克给员工的一封内部邮件火了。鼓励员工拒绝开会、公司规定不合理可以不遵守……俨然一个为员工着想的好老板。一开始人们还奇怪马斯克的画风怎么变这么快,后来才发现原来这是他6年前写的。对象也不是推特员工&#…
阅读更多...
今天我们讨论一下面试高频题,为什么 Redis 那么快? 首先,你可以先想一下答案,我先说下大家普遍的答案:
单线程基于内存操作,速度快I/O 多路复用
相信很多人第一时间回答出来上面这些,那么面试官…
阅读更多...
上回说到搭建jupyter环境,今天的文章主要就是熟悉jupyter上的基本操作,以及python的一些基础语法。
1、熟悉jupyter界面使用方法
通过命令行进入jupyter后,选择python3。 进去之后就是如下界面,要熟悉以下操作。当…
阅读更多...
1运行中的Nginx进程间的关系
1.在正式提供服务的产品环境下,部署Nginx时都是使用一个master进程来管理多个worker进程,一般情况下,worker进程的数量与服务器上的CPU核心数相等。每一个worker进程都是繁忙的,它们在真正地提供互联…
阅读更多...
随着全新smart精灵#1正式登陆欧洲,全球移动出行科技公司亿咖通科技同步向欧洲车主揭晓其搭载于新车上的下一代智能座舱系统,并正式将其出海战略向前推进关键一步,成为中国智能化出海的一座崭新里程碑。
全新smart精灵#1预计将于2022年底开始&…
阅读更多...
【POJ No. 1195】 矩形区域查询 Mobile phones
北大 OJ 题目地址 【题意】
移动电话的基站区域分为多个正方形单元,形成S S 矩阵,行和列的编号为0~S -1,每个单元都包含一个基站。一个单元内活动手机的数量可能发生变化ÿ…
阅读更多...
一、注解配置SpringMVC 采用全注解开发,替代我们的web.xml和SpringMVC的核心配置文件 我们需要创建对应的配置类,继承AbstractAnnotationConfigDispatcherServletInitializer 使用的Servlet版本要求在3.0以上项目启动后容器会找到配置了,基于…
阅读更多...
Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。
Kotlin高仿…
阅读更多...
在【DDD与应用架构】一文中我们说过,应用架构的存在就是为了把一团混沌的代码变得有秩序,好管理。我们保持最核心逻辑不变,就可以保持系统的稳定与发展。领域驱动设计的作者 Eric Evans 说:“为了使领域模型成为有价值的资产&…
阅读更多...
文章目录一、配置目录二、配置格式PHP数组定义其它格式的支持二级配置三、配置加载惯例配置应用配置拓展配置场景配置四、读取配置参数五、动态配置设置配置参数六、独立配置独立配置文件V5.0.1版本已经废除该写法自动读取扩展配置七、配置作用域八、环境变量配置一、配置目录 …
阅读更多...
项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。
项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。
环境需要 1.运行环境:最好是python3.7.7,…
阅读更多...
在 Linux 系统中,出现空的目录这是很正常的事情,而且,也是有办法一次性把它们都找出来的。
但是,仅仅列出空目录并不是我们的目的,我们今天了解一下如何删除这些空的目录。
在Linux中查找空目录
查找空目录…
阅读更多...
AI人工智能大模型讲师叶梓《基于人工智能的内容生成(AIGC)理论与实践》培训提纲
Mybatis SQL构建器类 - SqlBuilder and SelectBuilder (已经废弃)
【BCC动态跟踪PostgreSQL】
从0创建springboot项目并创建GitHub仓库
【C++】循环结构中的变量的生命周期
canvas绘制圆点示例
react--自定义列表字段
vscode 配置git
青少年软件编程(C语言)等级考试试卷目录一览
Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
LabVIEW从另一个VI或通过VI服务器访问正在运行的可执行文件
UWA报告使用技巧小视频,你get了么?(第八弹)
# lvs负载均衡
#DAYU200#如何动态调节屏幕亮度
#边学边记 必修4 高项:对事的管理 第4章 项目进度管理之定义活动
(02)Cartographer源码无死角解析-(09) gflags与glog简介、及其main函数讲解
(02)Cartographer源码无死角解析-(28) GlobalTrajectoryBuilder构建过程与整体分析
(4)(4.4) 使用测试版和开发版
(5)catanddong_用resnet18迁移学习分类和测试
(ICLR-2019)DARTS:可微分架构搜索
(Week 12)综合复习(动态规划,数学)
(二)Linux 基础命令
(附源码)php丽江旅游服务网站 毕业设计 010149
(附源码)springboot《升学日》日本大学信息及院校推荐网站 毕业设计 251949
(附源码)springboot人体健康检测微信小程序 毕业设计 012142
(附源码)计算机毕业设计ssm大学生身心健康管理系统
(附源码)计算机毕业设计ssm高铁乘坐舒适性在线调查及评价系统
(附源码)计算机毕业设计SSM基于JAVA线上订餐系统
(附源码)计算机毕业设计SSM基于web的小说浏览系统
(附源码)计算机毕业设计SSM基于农产品交易系统
(附源码)计算机毕业设计SSM基于微信平台的匿名电子投票系统
(附源码)计算机毕业设计SSM力高灯饰线上交易平台
(附源码)计算机毕业设计SSM银行服务评价系统
(附源码)计算机毕业设计SSM游戏盒子系统
(附源码)计算机毕业设计SSM智能仓储维修管理系统设计
(附源码)计算机毕业设计SSM中学线上作业评判系统
(附源码)计算机毕业设计高校学生宿舍管理信息系统
(个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
(考研湖科大教书匠计算机网络)第四章网络层-第六节3:开放最短路径优先OSPF的基本工作原理
(免费分享)基于javaweb,ssm旅游景点预定系统
(三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
(十二)反射与特性 -反射与预定义特性(1)
(原创)Flow数据流的使用
(重要)实数域上一切范数等价的证明
.NET Core Nacos 配置中心
.NET Core SDK版本切换
.Net Core实现健康检查
.Net6 Web Core API --- Autofac -- AOP
.netcore grpc日志记录配置
.NET教程 - LINQ
/lib64/libstdc++.so.6: version `CXXABI_1.3.8‘ not found
@capacitor/filesystem更改downloadfile支持本地文件下载
[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-048(CVE-2017-9791)
[ 数据结构 - C++]红黑树RBTree
[ACTF2020 新生赛]Exec1命令注入
[Android]创建TabBar
[Android移动安全渗透基础教程] 如何理解Android 架构与Android UID?
[C++11 多线程异步] --- std::promise/std::future
[containerd] 在Windows上使用IDEA远程调试containerd, ctr, containerd-shim
[CSS]圆角边框与阴影
[deeplearning]pytorch实现softmax多分类问题预测训练
[GXYCTF2019]BabyUpload - 文件上传+绕过(后缀文件类型文件内容.htaccess)
[HCTF 2018]WarmUp全网最详细解释
[HITCON 2017]SSRFme(perl脚本中get命令执行漏洞)
[HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页
[iHooya]2023年1月30日作业解析
[iotj 2022] 网络内处理还是特征压缩感知?使用无线传感器网络进行结构健康监测的案例研究
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)
[JAVAee]Spring项目的创建与基本使用
[JavaWeb]—前端篇
[jQuery]黑马课程学习笔记(一篇完)
[LeetCode周赛复盘] 第 328 场周赛20230115
[MatLab]矩阵运算和程序结构
[MySQL]变量