Json工具(二)- GSON

1. GSON简介

Gson 是 Google 提供的Java的 JSON 序列化和反序列化库。

2. GSON的基本使用

(1)构建Gson对象


@Test
public void test0() {/*建造者构建*/Gson gson1 = new GsonBuilder().create();/*直接构建*/Gson gson2 = new Gson();
}

(2)序列化处理和反序列化处理


@Test
public void test() {Gson gson = new GsonBuilder().create();TestProduct1 testProduct = new TestProduct1();testProduct.setProductName("白悟空");testProduct.setProductId("123456");testProduct.setProductType("game");testProduct.setProductPrice(new BigDecimal(1000));testProduct.setProductDesc("great experience");String json = gson.toJson(testProduct);System.out.println(json);TestProduct2 testProduct2 = gson.fromJson(json, TestProduct2.class);System.out.println(testProduct2);
}

3. GSON的配置构建


@Test
public void test2() {Gson gson = new GsonBuilder().setPrettyPrinting() // 使输出的JSON格式化为易读的格式。.setFormattingStyle() // 自定义JSON格式化输出格式.setDateFormat() // 设置日期格式.setExclusionStrategies() // 设置序列化和反序列化的排除策略,实现ExclusionStrategy接口,重写方法筛选不需要序列化的类里面不需要的属性.setFieldNamingPolicy() // 设置字段命名策略.setFieldNamingStrategy() // 设置字段命名策略.setVersion() // 设置版本控制,序列化时只处理指定版本的字段.setStrictness().setLongSerializationPolicy() // 设置长整型的序列化策略。.setNumberToNumberStrategy() // 已废弃,建议使用NumberTypeAdapterFactory.setObjectToNumberStrategy() // 已废弃,建议使用NumberTypeAdapterFactory.addDeserializationExclusionStrategy() // 添加反序列化排除策略.addSerializationExclusionStrategy() // 添加序列化排除策略.disableHtmlEscaping() //  禁用HTML字符转义.disableJdkUnsafe() // 禁用对不安全JDK类型的支持.disableInnerClassSerialization() // 禁用内部类的序列化.enableComplexMapKeySerialization() // 启用复杂类型的Map键序列化.excludeFieldsWithModifiers() //  排除具有指定修饰符的字段。.registerTypeAdapter() // 注册自定义类型适配器.registerTypeAdapterFactory() // 注册自定义类型适配器工厂.registerTypeHierarchyAdapter() // 注册自定义类型适配器.serializeNulls() // 序列化空值.create();
}

4. GSON注解说明

@Expose:指定字段是否参与序列化和反序列化


@Expose(serialize = true, deserialize = true)
private String name;

@JsonAdapter:指定自定义的类型适配器来处理特定字段的序列化和反序列化。


@JsonAdapter(CustomTypeAdapter.class)
private SomeType customField;

@SerializedName: 指定JSON字段名称与Java字段名称的映射关系


@SerializedName("json_name")
private String javaName;

@Since:指定字段的版本,只有在指定版本及以上时,字段才会被序列化和反序列化


@Since(1.0)
private String versionedField;

@Util:指定字段的版本,只有在指定版本以下时,字段才会被序列化和反序列化。


@Until(1.5)
private String deprecatedField;

5. GSON自定义序列化和反序列化

Gson自定义序列化和反序列化有两种常见的实现方式:

1. 实现JsonSerializer和JsonDeserializer接口,重写其序列化和反序列化方法。需要在创建Gson的时候注册到Gson中,或者结合@JsonAdapter注解使用。
2. 继承TypeAdapter重写read和write方法。需要在创建Gson的时候注册到Gson中,或者结合@JsonAdapter注解使用自定义的TypeAdapter。

(1)实现JsonSerializer和JsonDeserializer接口自定义序列化和反序列化
实现JsonSerializer和JsonDeserializer接口,结合@JsonAdapter注解实现序列化和反序列化,案例如下:


(2)继承TypeAdapter自定义序列化和反序列化


6. GSON的序列化与反序列化流程

7.JsonReader

(1)JsonReader介绍

JsonReader是流JSON解析器,并且是拉式解析器的示例。推送解析器解析JSON令牌并将其推送到事件处理器中。

(2)令牌

在流模式下,每个 JSON 数据都被视为一个单独的令牌。 当我们使用JsonReader处理它时,每个令牌将被顺序处理。 例如,

{"name":"xuyuan"}

在使用JsonReader进行解析时,上述 JSON 将生成 4 个令牌:

令牌 1={
令牌 2=name
令牌 3=xuyuan
令牌 4=}

(3)如何创建 GSON JsonReader

简单示例如下:

public void test() {String json = "{}";JsonReader jsonReader = new JsonReader(new StringReader(json));
}

我们可以根据 JSON 流的来源使用以下阅读器之一:

BufferedReader 
LineNumberReader
CharArrayReader
InputStreamReader
FileReader
FilterReader
PushbackReader
PipedReader
StringReader

(4)使用JsonReader处理数据

在创建包装了有效 JSON 源的JsonReader之后,我们可以开始对流令牌进行迭代并查看令牌值。 以下是在令牌上使用JsonReader读取简单
JSON 的示例。

public void test3() throws IOException {String json = "{'id': 1001,'firstName': 'Lokesh','lastName': 'Gupta','email': null}";JsonReader jsonReader = new JsonReader(new StringReader(json));jsonReader.setLenient(true);try {while (jsonReader.hasNext()) {JsonToken nextToken = jsonReader.peek();if (JsonToken.BEGIN_OBJECT.equals(nextToken)) {jsonReader.beginObject();} else if (JsonToken.NAME.equals(nextToken)) {String name = jsonReader.nextName();System.out.println("Token KEY >>>> " + name);} else if (JsonToken.STRING.equals(nextToken)) {String value = jsonReader.nextString();System.out.println("Token Value >>>> " + value);} else if (JsonToken.NUMBER.equals(nextToken)) {long value = jsonReader.nextLong();System.out.println("Token Value >>>> " + value);} else if (JsonToken.NULL.equals(nextToken)) {jsonReader.nextNull();System.out.println("Token Value >>>> null");} else if (JsonToken.END_OBJECT.equals(nextToken)) {jsonReader.endObject();}}} catch (IOException e) {e.printStackTrace();} finally {jsonReader.close();}
}

执行结果如下:

Token KEY >>>> id
Token Value >>>> 1001
Token KEY >>>> firstName
Token Value >>>> xu
Token KEY >>>> lastName
Token Value >>>> yuan
Token KEY >>>> email
Token Value >>>> null

代码说明:

JsonReader的hasNext()方法如果有更多令牌,则返回true。
peek()方法返回下一个 JSON 令牌,但不移至下一个。
随后,多次调用peek()将返回相同的 JSON 令牌。
可以使用JsonToken类的常量检查返回令牌的类型。
使用beginArray()和endArray()方法检查数组的左括号'['和']'。
使用beginObject()和endObject()方法检查对象的左括号'{'和'}'。
令牌的密钥的类型为JsonToken.NAME。 使用nextName()方法获取密钥名称。
确定令牌类型后,使用nextLong(),nextString()和nextInt()等方法获取令牌的值。
可以使用nextNull()或skipValue()使用空字面值。
所有next....()方法都返回当前令牌的值,并将内部指针移到下一个。
当遇到未知名称时,严格的解析器应该失败,并带有异常。 宽松解析器应调用skipValue()来递归地跳过该值的嵌套令牌,否则可能会发生冲突。

8.JsonWriter

(1)JsonWriter介绍

JsonWriter 是 Gson 库中的一个类,用于以流式方式写入 JSON 数据。流式写入的好处是可以有效处理大规模数据或在内存有限的情况下生成
JSON 数据。

(2)如何创建 GSON JsonReader

StringWriter stringWriter = new StringWriter(1024);
JsonWriter jsonWriter = new JsonWriter(stringWriter);

(3)使用JsonReader处理数据


@Test
public void test6() throws IOException {StringWriter stringWriter = new StringWriter(1024);JsonWriter jsonWriter = new JsonWriter(stringWriter);jsonWriter.beginObject();jsonWriter.name("name").value("xuyuan");jsonWriter.name("age").value(25);jsonWriter.name("addresses");jsonWriter.beginArray();jsonWriter.beginObject();jsonWriter.name("street").value("123 Main St");jsonWriter.name("city").value("Anytown");jsonWriter.endObject();jsonWriter.endArray();jsonWriter.endObject();jsonWriter.flush();jsonWriter.close();System.out.println(stringWriter);
}

输出结果如下:

{"name":"xuyuan","age":25,"addresses":[{"street":"123 Main St","city":"Anytown"}]}

9.JsonParser

JsonParser用于将 Json 数据解析为JsonElement并因此解析为JsonObject的解析树。 JsonObject可用于使用 JSON 字符串中的相应键来访问值。

(1)创建JsonParser

JsonParser parser = new JsonParser();

(2)解析Json

JsonParser类提供 3 种方法来提供 JSON 作为源并将其解析为JsonElement的树

* JsonElement parse(JsonReader json) – 使用JsonReader将 JSON 作为令牌流读取,并从 JSON 流中返回下一个值作为分析树。
* JsonElement parse(java.io.Reader json) – 使用指定的读取器读取 JSON,并将 JSON 字符串解析为解析树。
* JsonElement parse(java.lang.String json) - 将指定的 JSON 字符串解析为解析树。

(3)JsonElement、JsonArray、JsonNull、JsonObject、JsonPrimitive

JsonElement 是 Gson 库中所有 JSON 元素的基类。它是一个抽象类,代表了 JSON 中的任何元素。 它有多个子类,分别代表 JSON
中的不同数据结构。你可以通过 JsonElement 的实例来操作 JSON 数据,但具体的数据操作通常会涉及到其具体子类。常用方法如下:

* isJsonObject():检查该元素是否是 JsonObject。
* isJsonArray():检查该元素是否是 JsonArray。
* isJsonPrimitive():检查该元素是否是 JsonPrimitive。
* isJsonNull():检查该元素是否是 JsonNull。
* getAsJsonObject():将 JsonElement 转换为 JsonObject。
* getAsJsonArray():将 JsonElement 转换为 JsonArray。
* getAsJsonPrimitive():将 JsonElement 转换为 JsonPrimitive。
* getAsJsonNull():将 JsonElement 转换为 JsonNull。

JsonObject 表示 JSON 对象。它是 JsonElement 的一个具体实现,代表 JSON 数据中的对象结构(由键值对组成)。常用方法如下:

* add(String property, JsonElement value):向 JSON 对象中添加一个属性。
* get(String property):获取 JSON 对象中指定属性的值。
* remove(String property):从 JSON 对象中移除指定属性。
* has(String property):检查 JSON 对象中是否包含指定的属性。
* entrySet():获取 JSON 对象中所有键值对的集合。

JsonArray 表示 JSON 数组。它是 JsonElement 的一个具体实现,代表 JSON 数据中的数组结构(由一个或多个 JSON 元素组成)。常用方法如下:

* add(JsonElement element):向 JSON 数组中添加一个元素。
* get(int index):获取 JSON 数组中指定索引的元素。
* remove(int index):从 JSON 数组中移除指定索引的元素。
* size():获取 JSON 数组的元素个数。
* set(int index, JsonElement element):在指定索引处设置 JSON 数组的元素

JsonPrimitive 表示 JSON 中的原始值(基本数据类型)。它是 JsonElement 的一个具体实现,用于表示 JSON
中的字符串、数字、布尔值等原始数据类型。常用方法如下:

* getAsString():将 JsonPrimitive 转换为 String。
* getAsNumber():将 JsonPrimitive 转换为 Number。
* getAsBoolean():将 JsonPrimitive 转换为 boolean。
* isString():检查 JsonPrimitive 是否表示一个字符串。
* isNumber():检查 JsonPrimitive 是否表示一个数字。
* isBoolean():检查 JsonPrimitive 是否表示一个布尔值。

JsonNull 表示 JSON 中的 null 值。它是 JsonElement 的一个具体实现,专门用于表示 JSON 数据中的 null。常用方法如下:

* isJsonNull():检查该元素是否是 JsonNull。
* getAsJsonNull():将 JsonElement 转换为 JsonNull

(4)示例


@Test
public void test4() {String json = "{'id': 1001,'firstName': 'xu','lastName': 'yuan','email': null}";JsonElement jsonElement = new JsonParser().parse(json);JsonObject jsonObject = jsonElement.getAsJsonObject();System.out.println(jsonObject.get("id"));System.out.println(jsonObject.get("firstName"));System.out.println(jsonObject.get("lastName"));System.out.println(jsonObject.get("email"));
}

执行结果如下:

1001
"xu"
"yuan"
null

(5)使用fromJson()获得JsonObject


@Test
public void test5() {String json = "{'id': 1001,'firstName': 'xu','lastName': 'yuan','email': null}";JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);System.out.println(jsonObject.get("id"));System.out.println(jsonObject.get("firstName"));System.out.println(jsonObject.get("lastName"));System.out.println(jsonObject.get("email"));
}

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

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

相关文章

固定表头、首列 —— uniapp、vue 项目

项目实地&#xff1a;也可以在 【微信小程序】搜索体验&#xff1a;xny.handbook 另一个体验项目&#xff1a;官网 一、效果展示 二、代码展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由

之前学习了Nacos&#xff0c;用于发现并注册、管理项目里所有的微服务&#xff0c;而OpenFeign简化微服务之间的通信&#xff0c;而为了使得前端可以使用微服务项目里的每一个微服务的接口&#xff0c;就应该将所有微服务的接口管理起来方便前端调用&#xff0c;所以有了网关。…

[免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版…

Android15请求动态申请存储权限完整示例

效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm

深度学习系列79:Text2sql调研

参考 https://github.com/topics/text-to-sql 这里是一些资源&#xff1a;https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 这里是综述文章&#xff1a;https://zhuanlan.zhihu.com/p/647249972 1. 数据集 Spider: 一个跨域的复杂text2sql数据集&a…

Deepseek应用技巧-chatbox搭建前端问答

目标&#xff1a;书接上回&#xff0c;由于本地私有化部署了deepseek的大模型&#xff0c;那怎么能够投入生产呢&#xff0c;那就必须有一个前端的应用界面&#xff0c;好在已经有很多的前人已经帮我们把前段应用给搭建好了&#xff0c;我们使用就可以啦&#xff0c;今天我们就…

Bootstrap:图标库的安装及其使用

一、安装 使用npm包管理器安装。 npm i bootstrap-icons 二、使用图标 首先先引入bootstrap-icons.css库&#xff0c;然后从官方网站选择想要的图标然后复制使用代码。 示例代码&#xff1a;使用vue引入对应css文件后&#xff0c;使用库图标。 <script setup>import &qu…

Linux网络之数据链路层协议

目录 数据链路层 MAC地址与IP地址 数据帧 ARP协议 NAT技术 代理服务器 正向代理 反向代理 上期我们学习了网络层中的相关协议&#xff0c;为IP协议。IP协议通过报头中的目的IP地址告知了数据最终要传送的目的主机的IP地址&#xff0c;从而指引了数据在网络中的一步…

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…

“量子心灵AI“的监控仪表盘 - javascript网页设计案例

【前端实战】基于Three.js和Chart.js打造未来科技风AI监控仪表盘 本文通过AI辅助开发&#xff0c;详细记录了一个高级前端项目的完整实现过程。文章包含核心代码片段、技术要点及遇到的问题与解决方案。适合有一定前端基础的开发者学习参考。 1. 项目概述 本文详细介绍了一个名…

vtkDepthSortPolyData 根据相机视图方向对多边形数据进行排序

1. 作用 在 3D 渲染中&#xff0c;透明对象的渲染顺序非常重要。如果透明对象的渲染顺序不正确&#xff0c;可能会导致错误的视觉效果&#xff08;例如&#xff0c;远处的透明对象遮挡了近处的透明对象&#xff09;。vtkDepthSortPolyData 通过对多边形数据进行深度排序&#…

第十五章:go package 包的管理

import f "fmt"   // 注意 这里 f 是包的别名 init初始化函数 在每一个Go源文件中&#xff0c;都可以定义任意个如下格式的特殊函数&#xff1a; func init(){// ... } package&#xff1a;声明包的关键字 packagename&#xff1a;包名&#xff0c;可以不与文…

【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统

【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统 存储器存储器相关概念存储器分类存储器系统存储器性能指标存储器层次概述程序访问的局部性原理SRAM存储器存储器的读写周期DRAM存储器DRAM控制器高性能的主存储器存储器扩展只读存储器ROM光擦可编程只读存储…

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器

开源&#xff01;速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器 目录 开源&#xff01;速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器本项目未经授权&#xff0c;禁止商用&#xff01;本项目未经授权&#xff0c;禁止商用&#xff01;本项目未经授权&…

20250212:linux系统DNS解析卡顿5秒的bug

问题: 1:人脸离线识别记录可以正常上传云端 2:人脸在线识别请求却一直超时 3:客户使用在线网络 思路:

爱普生温补晶振 TG5032CFN高精度稳定时钟的典范

在科技日新月异的当下&#xff0c;众多领域对时钟信号的稳定性与精准度提出了极为严苛的要求。爱普生温补晶振TG5032CFN是一款高稳定性温度补偿晶体振荡器&#xff08;TCXO&#xff09;。该器件通过内置温度补偿电路&#xff0c;有效抑制环境温度变化对频率稳定性的影响&#x…

【病毒分析】熊猫烧香病毒分析及其查杀修复

目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …

JavaWeb后端基础(7)AOP

AOP是Spring框架的核心之一&#xff0c;那什么是AOP&#xff1f;AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白了&#xff0c;面向切面编程就是面向特定方法编程。AOP是一种思想&#xff0c;而在Spring框…

AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录

AutoDL平台租借GPU&#xff0c;创建transformers环境&#xff0c;使用VSCode SSH登录 一、AutoDl平台租用GPU 1.注册并登录AutoDl官网&#xff1a;https://www.autodl.com/home 2.选择算力市场&#xff0c;找到需要的GPU&#xff1a; 我这里选择3090显卡 3.这里我们就选择P…

三维建模与视频融合(3D-Video Integration)技术初探。

三维建模与视频融合&#xff08;3D-Video Integration&#xff09;是一种将虚拟三维模型无缝嵌入实拍视频场景的技术&#xff0c;广泛应用于影视特效、增强现实&#xff08;AR&#xff09;、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…