Java中Json字符串和Java对象的互转
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。
JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使 JSON 成为理想的数据交换语言。几乎所有的APP、应用、网站、程序都离不开 JSON。
常见的 Json 解析器:Gson,Fastjson,Json-lib,Jackson
文章目录
- 一、Java中Json字符串和Java对象的互转概述
- 1、关于 Json
- 2、Json 解析器
- 二、使用 Gson 完成 Json 字符串和 Java 对象的互转
- 1、Gson 介绍
- 2、Gson 引入
- 3、Gson 主要类介绍
- 4、Gson Demo
- 5、对象与 Json 互转
- 6、直接操作 Json 以及一些 Json 的工具
- 7、gsonUtil 工具类
- 三、使用 FastJson 完成 Json 字符串和 Java 对象的互转
- 1、FastJson 介绍
- 2、FastJson 引入
- 3、null 值对应 key 的序列化
- 4、FastJson Demo
- 5、对象与 Json 互转
一、Java中Json字符串和Java对象的互转概述
1、关于 Json
Json(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。Json 是目前主流的前后端数据传输方式。
Json 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使 Json 成为理想的数据交换语言。几乎所有的APP、应用、网站、程序都离不开 Json。
2、Json 解析器
常见的 Json 解析器:Gson,FastJson,Json-lib,Jackson
- Gson(又称Google Gson)是 Google 公司发布的一个开放源代码的 Java 库。特点是快速高效,代码量少、简洁;
- FastJson 是一个Java语言编写的高性能的 Json 处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的 Jar,能够直接跑在 Jdk 上;
- Json-lib 最开始的也是应用最广泛的 Json 解析工具,Json-lib 不好的地方确实是依赖于很多第三方包;
- 相比 Json-lib 框架,Jackson 所依赖的 Jar 包较少,简单易用并且性能也要相对高些。而且 Jackson 社区相对比较活跃,更新速度也比较快。Jackson 对于复杂类型的 Json 转换Bean 会出现问题,一些集合 Map,List 的转换出现问题。
序列化性能:FastJson > Jackson > Gson > Jsonlib
反序列化性能:Gson > Jackson > FastJson > Jsonlib
二、使用 Gson 完成 Json 字符串和 Java 对象的互转
1、Gson 介绍
Google 的 Gson 是目前功能最全的 Json 解析神器,Gson 当初是为因应 Google 公司内部需求而由 Google 自行研发,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson 的应用主要为 toJson 与 fromJson 两个转换函数,无依赖,不需要例外额外的 Jar,能够直接跑在 Jdk 上。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将Json 字符串成功转换成相对应的对象。类里面只要有 get 和 set 方法,Gson 完全可以将复杂类型的 Json 到 Bean 或 Bean 到 Json 的转换,是 Json 解析的神器。
Ps:尽管 Gson 在功能上面无可挑剔,但是性能上面比 FastJson 有所差距。
2、Gson 引入
Maven 依赖引入:
<!--gson--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency>
3、Gson 主要类介绍
Gson 主要类:
- Gson 类:解析 Json 的最基础的工具类
- JsonParser 类:解析器来解析 Json 到 JsonElements 的解析树
- JsonElement 类:一个类代表的 Json 元素
- JsonObject 类:Json 对象类型
- JsonArray 类:JsonObject 数组
- TypeToken 类:用于创建 type,比如泛型 List<?>
4、Gson Demo
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;public class GsonTestClass {public static void main(String[] args) {User user = new User();user.setId(1);user.setName("栗筝i");Gson g = new GsonBuilder().create();String str = g.toJson(user);System.out.println(str);}
}
Ps:默认是不序列化 null 值对应的 key 的,若是想序列化 null 值对应的 key,只需要将以上创建代码改成以下代码就行:
Gson g = new GsonBuilder().serializeNulls().create();
5、对象与 Json 互转
# bean 转换 Json
Gson gson = new Gson();
// obj 是对象
String json = gson.toJson(obj);
Ps:当我们需要把定义类的成员变量属性名和返回的 Json 中的格式名称隔离开,可以采用 @SerializedName 注解标记!!
# Json 转换 bean
Gson gson = new Gson();
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
Book book = gson.fromJson(json, Book.class);
# Json 转换复杂的 bean,比如 List,Set
Gson gson = new Gson();
String json = "[{\"id\":\"1\",\"name\":\"栗筝i\"},{\"id\":\"2\",\"name\":\"栗筝ii\"}]";
// 将 Json 转换成 List
List list = gson.fromJson(json, new TypeToken<LIST>() {}.getType());
// 将 Json 转换成 Set
Set set = gson.fromJson(json, new TypeToken<SET>() {}.getType());
6、直接操作 Json 以及一些 Json 的工具
# 格式化 Json:
String json = "[{\"id\":\"1\",\"name\":\"栗筝i\"},{\"id\":\"2\",\"name\":\"栗筝ii\"}]";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(json);
json = gson.toJson(je);
# 判断字符串是否是 Json(通过捕捉的异常来判断是否是 Json)
String json = "[{\"id\":\"1\",\"name\":\"栗筝i\"},{\"id\":\"2\",\"name\":\"栗筝ii\"}]";
boolean jsonFlag;
try {new JsonParser().parse(str).getAsJsonObject();jsonFlag = true;
} catch (Exception e) {jsonFlag = false;
}
# 从 Json 串中获取属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'id';
String propertyValue = "";
try {JsonParser jsonParser = new JsonParser();JsonElement element = jsonParser.parse(json);JsonObject jsonObj = element.getAsJsonObject();propertyValue = jsonObj.get(propertyName).toString();
} catch (Exception e) {propertyValue = null;
}
# 除去 Json 中的某个属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'id';
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
json = jsonObj.toString();
# 向 Json 中添加属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'age';
Object propertyValue = "26";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();
# 修改 Json 中的属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'name';
Object propertyValue = "栗筝ii";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();
# 判断 Json 中是否有属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'name';
boolean isContains = false ;
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
isContains = jsonObj.has(propertyName);
7、gsonUtil 工具类
import com.dechnic.common.anno.gson.Exclude;
import com.dechnic.common.po.ObjectTypeAdapter;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class GsonUtll {private static Gson gson;static {ExclusionStrategy strategy = new ExclusionStrategy() {@Overridepublic boolean shouldSkipField(FieldAttributes f) {return f.getAnnotation(Exclude.class) !=null;}@Overridepublic boolean shouldSkipClass(Class<?> clazz) {return false;}};gson = new GsonBuilder().disableHtmlEscaping().setExclusionStrategies(strategy).registerTypeAdapter(new TypeToken<Map<String,Object>>(){}.getType(),new ObjectTypeAdapter()).serializeNulls().create();}public static Map<String,Object> jsonStr2Map(String jsonStr){return gson.fromJson(jsonStr, new TypeToken<Map<String, Object>>() {}.getType());}public static List<Map<String,Object>> jsonStr2ListMap(String jsonStr){return gson.fromJson(jsonStr, new TypeToken<List<Map<String, Object>>>() {}.getType());}public static String toJSON(Object object){return gson.toJson(object);}public static <T> List<T> json2ListBean(String result, Class<T> t){List list = gson.fromJson(result, new TypeToken<List>() {}.getType());List list2 = new ArrayList();for (Object o : list) {list2.add(json2Bean(toJSON(o),t));}return list2;}public static <T> T json2Bean(String result,Class<T>t){return gson.fromJson(result, t);}}
三、使用 FastJson 完成 Json 字符串和 Java 对象的互转
1、FastJson 介绍
Fastjson 由阿里巴巴公司开发,是一个 Java 语言编写的高性能的 Json 处理器。无依赖,不需要例外额外的 Jar,能够直接跑在 Jdk 上。
FastJson 在复杂类型的 Bean 转换 Json 上会出现一些问题,可能会出现引用的类型,导致 Json 转换出错,需要制定引用。
FastJson 采用独创的算法,将 parse 的速度提升到极致,超过所有 Json 库。
2、FastJson 引入
Maven 依赖引入:
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.23</version>
</dependency>
3、null 值对应 key 的序列化
FastJson 在转换 Java 对象为 Json 的时候,默认是不序列化 null 值对应的 key 的,也就是说当对象里面的属性为空的时候,在转换成 Json 时,不序列化那些为 null 值的属性
仔细看 FastJson 转换 Java 对象为 Json 的方法的入参:
public static String toJSONString(Object object, com.alibaba.fastjson2.JSONWriter.Feature... features)
可以看到 features 是一个数组 JSONWriter.Feature 则是其序列化属性:
- QuoteFieldNames———-输出 key 时是否使用双引号,默认为 true
- WriteMapNullValue——–是否输出值为 null 的字段,默认为 false
- WriteNullNumberAsZero———-数值字段如果为 null,输出为 0,而非 null
- WriteNullListAsEmpty———-List 字段如果为 null,输出为[],而非null
- WriteNullStringAsEmpty———-字符类型字段如果为 null,输出为”“,而非null
- WriteNullBooleanAsFalse———-Boolean 字段如果为 null,输出为 false,而非null
4、FastJson Demo
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;public class FastJsonTestClass {public static void main(String[] args) {User user = new User();user.setIdd(1);user.setName("栗筝i");String str = JSONObject.toJSONString(user, JSONWriter.Feature.WriteMapNullValue);System.out.println(str);}
}
Ps:当我们需要把定义类的成员变量属性名和返回的 Json 中的格式名称隔离开,可以采用 @JSONField 注解标记!!
5、对象与 Json 互转
# 对象转 Json
User user = new User();
user.setId(1);
user.setName("栗筝i");
System.out.println(JSON.toJSONString(user, JSONWriter.Feature.UseSingleQuotes));
# Json 转对象
String json = "{\"id\":1,'name':'张三'}";
User userModel = JSON.parseObject(json, User.class);
# 将 Json 解析为 JSONObject
String json = "{\"id\":1,'name':'张三'}";
JSONObject data = JSON.parseObject(json);
System.out.println(data.get("id"));
# 将 Json 解析为 JSONArray
String text = "...";
JSONArray data = JSON.parseArray(text);
相关文章:
Java中Json字符串和Java对象的互转
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的…...
代码随想录NO42 | 动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数
动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数70. 爬楼梯 (进阶) 在原题基础上,改为:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶…...
【C++从入门到放弃】初识C++(基础知识入门详解)
🧑💻作者: 情话0.0 📝专栏:《C从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! C基础…...
企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
【GPLT 三阶题目集】L3-016 二叉搜索树的结构
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分…...
核心交换机安全多业务高性能万兆交换机
RG-S5750-24SFP/12GT交换机是锐捷网络推出的融合了高性能、高安全、多业务的新一代三层交换机。RG-S5750-24SFP/12GT 交换机能够提供灵活的介质接口,满足网络建设中不同介质的连接需要。全千兆的端口形态,加上可扩展的高密度万兆端口,提供1&a…...
Android APK 签名打包原理分析(三)【静默安装的实现方案】
背景 小编目前从事的系统定制类工作,有客户提出了,需要后台“静默安装”他们的app,也就是悄无声息的安装,而且特别强调,不可以跳出任何安装引导页面,他们的app下载完成之后,后台调用公开的android install代码,系统就后台完成安装,安装完成之后,重新打开应用就可以。…...
mulesoft MCIA 破釜沉舟备考 2023.02.14.05
mulesoft MCIA 破釜沉舟备考 2023.02.14.05 1. Refer to the exhibit.2. A Kubernetes controller automatically adds another pod replica to the resource pool in response to increased application load.3. An XA transaction Is being configured that involves a JMS c…...
结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略
结构体的三种定义方法 一、单独定义: 先定义结构体类型,再定义变量 定义结构体的格式如下: struct 结构体名 { 若干数据项; } ; 其中,struct为关键字; 结构体名是用户定…...
cgo静态编译不能用glibc,用musl
Golang 的一个动态链接依赖问题 upx 是一个压缩二进制的工具,如上图,经过压缩之后,这些 binary 的体积都减少了 46%。 静态链接 CGO 的依赖 如果使用 glibc 的是,是不能静态链接的: rootf88271a666f9:/workspace# g…...
力扣解法汇总1124. 表现良好的最长时间段
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。…...
12- 降维算法 (PCA降维/LDA分类/NMF) (数据处理)
数据降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。PCA算法有两种实现方法: 基于特征值分解协方差矩阵实现PCA算法基于SVD分解协方差矩阵实…...
QT+ OpenGL学习
文章目录QT OpenGLQOpenGLWidget:不需要GLFWQOpenGLFunction_X_X_Core:不需要GLAD你好,三角形顶点输入顶点着色器片段着色器链接着色器本节代码元素缓冲对象EBOQT交互GLSLGLSL支持的类型输入输出Uniform纹理纹理单元纹理环绕纹理过滤多级渐远纹理QT OpenGL 本篇完整…...
C语言(字符串输入)
目录 一.gets和puts组合 二.fgets()和fputs() 三.fgets()函数返回 四.fgets读取满问题 五.修改fgets函数,自动用\0替换\n 一.gets和puts组合 Gets()读取整行输入,知道遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符的…...
背包问题求方案数(AcWing)(JAVA)
有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出 最优选法的方案数。注意答案可能很大,请输出答…...
一篇文章带你读懂HashMap
HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一。可见HashMap的掌握是多重要。 一、HashMap源码分析 1、构造函数 让我们先从构造函数说起,HashMap有四个构造方法,别慌 1.1 HashMap() // 1.无参构造方法、// 构造一…...
Java如何进行优雅的判空——Optional类的灵活应用
0 引言 在Java Web项目开发中,经常令人头疼的NPE问题(NullPointerException)——空指针,例如我们在调用equal()方法时,就经常会出现NPE问题: String str null; str.equals("fsfs");…...
Fluent Python 笔记 第 12 章 继承的优缺点
重点是说明对 Python 而言尤为重要的两个细节: 子类化内置类型的缺点多重继承和方法解析顺序 12.1 子类化内置类型很麻烦 内置类型(使用 C 语言编写)不会调用用户定义的类覆盖的特殊方法。 不要子类化内置类型,用户自己定义的类应 该继承 collections 模块(http…...
Go语言读取解析yml文件,快速转换yml到go struct
YAML (YAML Aint a Markup Language)是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被计算机程序识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入…...
第二十六章 java并发常见知识内容(ThreadLocal 详解)
JAVA重要知识点带着疑问看ThreadLocalGC 之后 key 是否为 null?ThreadLocalMap Hash 算法ThreadLocalMap Hash 冲突ThreadLocalMap.set()方法ThreadLocalMap过期 key 的探测式清理流程ThreadLocalMap扩容机制ThreadLocalMap.get()详解ThreadLocalMap过期 key 的启发…...
LVGL Canvas画布实战:5分钟教你制作一个可交互的简易绘图板
LVGL Canvas画布实战:5分钟教你制作一个可交互的简易绘图板 在嵌入式GUI开发领域,LVGL因其轻量级和高度可定制性成为众多开发者的首选。而Canvas画布控件作为其核心组件之一,能够实现从简单图形绘制到复杂交互界面的各种功能。今天࿰…...
终极FanControl中文使用指南:5分钟让你的Windows风扇控制更智能
终极FanControl中文使用指南:5分钟让你的Windows风扇控制更智能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...
AI原生Next.js启动器:集成Claude与Cursor的现代前端开发模板
1. 项目概述:一个为AI时代开发者量身定制的Next.js启动器如果你和我一样,每天都在和Next.js、TypeScript、Tailwind CSS打交道,同时又在频繁地与Claude、Cursor、Copilot这些AI编程助手“对话”,那你肯定也遇到过类似的烦恼&#…...
产品工程外包战略转型:从成本控制到价值共创
1. 产品工程外包的价值重构:从成本驱动到战略协同十五年前我刚入行IT咨询时,客户开口闭口都是"能省多少钱"。如今在硅谷参与过数十个跨国产品外包项目后,我深刻意识到:把PEO(产品工程外包)单纯看…...
如何快速将网页内容转换为Markdown格式:MarkDownload完整指南
如何快速将网页内容转换为Markdown格式:MarkDownload完整指南 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdown…...
凌扬微优势代理 LY3508 4.2V/1A充电/1.6A驱动 全桥马达驱动控制芯片 ESOP8 技术解析
在电动牙刷、智能垃圾桶等单节锂电池供电的马达类产品中,需要一款集成锂电池充电管理和全桥马达驱动的芯片,以实现电机正反转、刹车控制,并简化外围电路设计。LY3508是一款集成了锂电池充电管理模块、全桥马达驱动模块、续流二极管和逻辑控制…...
Windows Defender 彻底移除工具:专业级系统安全组件管理解决方案
Windows Defender 彻底移除工具:专业级系统安全组件管理解决方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_m…...
如何高效配置智能游戏助手:绝区零一条龙完整使用攻略
如何高效配置智能游戏助手:绝区零一条龙完整使用攻略 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 还在为《绝…...
网络优化工具开发全解析:从协议选型到多平台实现与运维
1. 网络连接优化工具的技术原理与实现思路在当今的互联网环境下,许多用户会遇到访问特定在线服务或资源时速度缓慢、连接不稳定甚至无法访问的情况。这背后通常涉及到复杂的网络路由、地域性内容分发策略以及网络基础设施的差异。为了解决这类问题,一些开…...
基于有限状态机的LLM智能体:Haath架构解析与工程实践
1. 项目概述:一个基于状态机的自主LLM智能体如果你正在构建或使用LLM智能体,大概率遇到过这样的困境:你把所有能调用的工具、API、函数都一股脑儿塞给模型,然后满怀期待地发出指令。结果呢?模型要么在几十个选项里犹豫…...
