前言

JSON 是 JavaScript 数据类型中的一个子集,目前主流的浏览器都使用了通用的 JavaScript 引擎组件,所以在解析 JSON 格式时具有良好的兼容性。这便是 “JavaScript Object Notation”(缩写为 JSON )诞生的由来。

本文按照我们的输入和输出结果类型进行分类,包括从其它类型转换到 JSON 相关,以及从 JSON 相关转换到其它类型这两大类。

注:以下都是基于阿里的 fastjson 来讲解操作的。

fastjson 可以将 JSON Parse 的性能提升到极致,是目前 Java 语言中最快的 JSON 库。fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web 输出、Android 客户端等多种应用场景。

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>

一、JSON 回顾

在开始分享文章的主要内容前,我们可以先回顾一下关于 JSON 的基础知识。

1.1结构形式

JSON 有键值对形式和数组形式这2种结构形式。

以下这个例子就是键值对类型的:

{
"playerInfo": {
"playerName": "Alex",
"playerAge": 18
},
"activityId": "871047729944117248",
"activityType": "OA",
"awardId": "886982449056579584",
"awardName": "OA测试",
"stageId": "816982449034752351",
"roundId": "808657473445768946",
"noticeTypes": "APP"
}

这种结构的 JSON 数据规则是:一个无序的 "key" : "value" 集合,一个 JSON 对象以 { 左括号开始,以 } 右括号结束。每个 "key" 后跟一个英文的 : 冒号,每个"key" : "value"之间使用英文的 , 逗号进行分隔。而每个 JSON 对象是可以嵌套的。

那 JSON 的数组形式又是怎么样的呢?下面同样再举一个例子:

{
"data": {
"content": [
{
"id": "926160574061371392",
"status": "PROGRESSING",
"updateContent": "测试一下",
"version": "10.6.0",
"createTime": "2023-10-31 17:11:28"
},
{
"id": "926160574061371326",
"status": "CANCELED",
"updateContent": "测试测试",
"version": "123.0",
"createTime": "2023-10-31 17:11:28"
}
]
},
"code": 200,
"msg": "成功",
"success": true
}

数组形式的 JSON 数据就是值(value)的有序集合。一个数组以 [ 左中括号开始, ] 右中括号结束。值之间使用 , 逗号分隔。


二、其它类型 -> JSON相关

这里的其它类型,包括 Java 对象、数组、String 字符串、泛型的 以及 Object 对象等;JSON相关表示 Json 对象、Json 字符串等。

2.1 JavaBean 转 JsonObject

实体类如下:

@Data
@EqualsAndHashCode(callSuper = true)//自动生成属性的 equals() 和 hashCode()方法,同时声明允许使用用父类的属性和方法
public class Computer extends BaseEntity {
/**
* 中央处理器
*/
private String cpu;
/**
* 内存
*/
private String memory;
/**
* GPU
*/
private String gpu;
/**
* 固态硬盘
*/
private String ssd;
}

实现示例:

    /**
* JavaBean 转 JsonObject
*/
@Test
public void javaBeanToJsonObject(){
Computer computer = new Computer();
computer.setCpu("r7-4800h");
computer.setGpu("RTX-3060");
computer.setSsd("512GB");
computer.setMemory("32GB");
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(computer);
log.info("------结果内容:{} 类型为:{}------", jsonObject, jsonObject.getClass());
}

转换结果:

JavaBean 转 JsonObject

2.2 JavaBean 转 Json 字符串

实现示例:

    /**
* JavaBean 转 Json 字符串
*/
@Test
public void javaBeanToJsonString(){
Computer computer = new Computer();
computer.setCpu("r7-4800h");
computer.setGpu("RTX-3060");
computer.setSsd("512GB");
computer.setMemory("32GB");
String jsonStr = JSON.toJSONString(computer);
log.info("------结果内容:{} 类型为:{}------", jsonStr, jsonStr.getClass());
}

转换结果:

JavaBean 转 Json 字符串

2.3 List 转 JsonArray

实现示例:

    /**
* List 转 JsonArray
*/
@Test
public void listToJsonArray(){
List<Computer> list = computerService.list();
JSONArray jsonArray = (JSONArray)JSONArray.toJSON(list);
log.info("------结果内容1:{} 类型为:{}------", jsonArray.get(0), jsonArray.getClass());
log.info("------结果内容1:{} 类型为:{}------", jsonArray.get(1), jsonArray.getClass());
log.info("------结果内容1:{} 类型为:{}------", jsonArray.get(2), jsonArray.getClass());
}

转换结果:

List 转 JsonArray

2.4 List 转Json 字符串

实现示例:

    /**
* List 转 Json 字符串
*/
@Test
void listToJsonStr() {
List<Computer> list = new ArrayList<>();
Computer computerOne = new Computer();
computerOne.setCpu("r7-4800h");
computerOne.setGpu("RTX-3060");
computerOne.setSsd("512GB");
list.add(computerOne);
Computer computerTwo = new Computer();
computerTwo.setCpu("i5-12600k");
computerTwo.setGpu("RTX-3060Ti");
computerTwo.setSsd("512GB");
list.add(computerTwo);
String listJson = JSON.toJSONString(list);
System.out.println(listJson);
}

转换结果:

List 转 Json 字符串

2.5Map 转 Json 字符串

实现示例:

    /**
* Map 转 Json 字符串
*/
@Test
void mapToJsonStr(){
Map<String, Object> map = new HashMap<>();
map.put("key1","AAA");
map.put("key2","bbb");
map.put("key3","CCC");
String mapJson = JSON.toJSONString(map);
System.out.println("mapJson:" + mapJson);
}

转换结果:

Map 转 Json 字符串


三、JSON 相关 -> 其它类型

3.1 Json 字符串转 JavaBean

实现示例:

    /**
* Json 字符串转 JavaBean
*/
@Test
void jsonStrToJavaBean(){
Computer computer = new Computer();
computer.setCpu("r7-4800h");
computer.setGpu("RTX-3060");
computer.setSsd("512GB");
computer.setMemory("32GB");
String jsonStr = JSON.toJSONString(computer);
System.out.println(jsonStr);
Computer result = JSONObject.parseObject(jsonStr, Computer.class);
System.out.println(result);
}

转换结果:

Json 字符串转 JavaBean

3.2 Json 字符串转 JsonObject

实现示例:

    /**
* Json 字符串转 JsonObject
*/
@Test
void jsonStrToJsonObject() {
String jsonStr = "{
\"activityId\": \"871047729944117248\",\n" +
" \"activityType\": \"OA\",\n" +
" \"awardId\": \"886982449056579584\",\n" +
" \"awardName\": \"OA测试\" }";
JSONObject parse = JSONObject.parseObject(jsonStr);
System.out.println(parse.getString("activityId"));
}

转换结果:

Json 字符串转 JsonObject

3.3 Json 字符串转 List

实现示例:

    /**
* Json 字符串转 List
*/
@Test
void jsonStrToList(){
String jsonStr = "[{ \"activityId\": \"871047729944117248\",\n" +
" \"activityType\": \"OA\",\n" +
" \"awardId\": \"886982449056579584\",\n" +
" \"awardName\": \"OA测试\" }]";
List<Map> maps = JSONArray.parseArray(jsonStr, Map.class);
maps.forEach(System.out::println);
}

转换结果:

Json 字符串转 List

3.4Json字符串转Map

实现示例:

    /**
* Json 字符串转 Map
*/
@Test
void jsonStrToMap(){
String jsonStr = "{\"AA\": 1,\"BB\":2,\"CC\":3}";
Map map = JSONObject.parseObject(jsonStr, Map.class);
map.forEach((o1, o2) -> System.out.println(o1 + "=" + o2));
}

转换结果:

Json 字符串转 Map


四、Json 相关互转

4.1 Json 数组字符串转 JsonArray

实现示例:

    /**
* Json 数组字符串转 JsonArray
*/
@Test
void jsonStrToJsonArray() {
JSONArray jsonArray = new JSONArray();
//初始化一个 Java 对象
Computer computer = new Computer();
computer.setCpu("r7-4800h");
computer.setGpu("RTX-3060");
computer.setSsd("512GB");
//初始化一个 JSONObject 对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("AAA", 100);
//将上述两个对象都丢到 JSONArray 对象中,即 JSONArray 不是一般的数组,是可以放各种 Object 到一个 JSONArray 对象里的
jsonArray.add(computer);
jsonArray.add(jsonObject);
String str = JSONArray.toJSONString(jsonArray);
System.out.println(str);
String jsonArrStr = "[{\"cpu\" : \"r7-4800h\",\"gpu\" : \"RTX-3060\"},{\"cpu\" : \"i5-12600K\",\"gpu\" : \"RTX-3060Ti\"}]";
JSONArray result = JSONArray.parseArray(jsonArrStr);
result.forEach(o -> System.out.println(o.toString()));
}

转换结果:

Json 数组字符串转 JsonArray

4.2 JsonObject 转 Json字符串

实现示例:

    /**
* JsonObject 转 Json字符串
*/
@Test
void jsonObjectToJsonStr() {
JSONObject jsonObject = new JSONObject();
//初始化一个 Java 对象
Computer computer = new Computer();
computer.setCpu("r7-4800h");
computer.setGpu("RTX-3060");
computer.setSsd("512GB");
jsonObject.put("computer", computer);
String jsonStr = JSON.toJSONString(jsonObject);
System.out.println(jsonStr);
}

转换结果:

JsonObject 转 Json字符串


五、文章小结

关于 Json 格式的介绍和日常开发中的 Json 转换经验大全就分享到这里。如果文章有错误和不足,还期待大家的指正。或者大家有什么其它补充,也欢迎在评论区交流!

【主流技术】日常工作中关于 JSON 转换的经验大全(Java)的更多相关文章

  1. Shell在日常工作中的应用实践

    作者:京东物流 李光新 1 Shell可以帮我们做什么 作为一名测试开发工程师,在与linux服务器交互过程中,大都遇到过以下这些问题: •一次申请多台服务器,多台服务器需要安装相同软件,配置相同的环 ...

  2. 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

    分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前 ...

  3. 关于git你日常工作中会用到的一些东西

    前言 git是一个版本控制工具, 版本控制主要的好处有三点: 从当前版本回退到任意版本 查看历史版本 对比两个版本差异 git 相关术语 repository 仓库 branch 分支 summary ...

  4. 博主日常工作中使用的shell脚本分享

    前言: 今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作.该脚本用于本地电脑和服务器交互上,实现以下功能: 自动拉取自己个人电脑上的源码到服务器上yocto包 ...

  5. 日常工作中的点滴总结from 2014-03

    一 关于 写方案: 写某个产品的方案基本应包括以下几点: 1产品目前现状(国内外)  2产品意义.作用 3产品架构 4产品优势 5产品功能讲解 二 关于 处理下属工作方向不正确的事务 首先 先肯定 下 ...

  6. Git 日常工作中使用的命令记录

    前言   这篇文章主要是介绍我在使用Git中的有一些忘记了,但是很重要的命令. 20190424 Git 历史信息 username 和 email 更改 git config alias.chang ...

  7. 日常工作中常见的mysql优化技巧

    1.介绍一下MYSQL经常使用的优化技巧. MySQL 自带 slow log 的分析工具 mysqldumpslow ,可是没有说明.本文通过分析该脚本,介绍了其用法. slow log 是 MyS ...

  8. 日常工作中VBA代码积累

    1.超链接地址提取 Function GetURL(rng As Range) As String On Error Resume Next GetURL = rng.Hyperlinks(1).Ad ...

  9. 日常工作中的点滴:C# 根据字节长度截包含中文的字符串

    方法中利用正则表达式判断某个字符是否是中文 public string SubStringB(string text,int length){ int target=0; int b=0; for(i ...

  10. 日常工作中使用的一些Mongodb语句

    .通过_userID字段查询重复录入内容 > db.template.aggregate({}}},{$}}) .查询 db.template.find({"group_7ee1247 ...

随机推荐

  1. TienChin 活动管理-搜索活动

    ActivityController @PreAuthorize("hasPermission('tienchin:activity:list')") @GetMapping(&q ...

  2. 安装 Nginx 修改默认端口

    用远程工具连接我们上次购买的机器,这里我要介绍一个知识点,博主使用的工具是 MobaXterm,这个工具有一个多操作的功能,在下图的位置可以开启多操作,然后连接你的服务器机子即可: 首先我们将机子里面 ...

  3. 小白学k8s(12)-k8s中PV和PVC理解

    pv和pvc 什么是pv和PVC 生命周期 PV创建的流程 1.创建一个远程块存储,相当于创建了一个磁盘,称为Attach 2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount 3.绑定 持久化卷声 ...

  4. python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

    1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...

  5. 4.6 C++ Boost 函数绑定回调库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  6. SpringCloud-03-Nacos配置管理

    Nacos配置管理 原理图: 1.统一配置管理 ① 在Nacos中添加配置信息 ② 在弹出表单中填写配置信息 ③ 配置获取的步骤*(原理) ④ 引入Nacos的配置管理客户端依赖 <!--nac ...

  7. C/C++可变参数模版和函数指针的结合

    目录 1.说明 2.模板类传入固定参数的C函数指针 3.模板类传入固定参数的C++函数指针 3.1.用函数对象替代函数指针存储 4.模板类传入不定参数的C函数指针 5.模板类传入不定参数的C++成员函 ...

  8. 基数排序|RadixSort|C++实现

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量干货博客汇总https://blog. ...

  9. 【算法】基于hoare快速排序的三种思想和非递归,基准值选取优化【快速排序的深度剖析-超级详细的注释和解释】你真的完全学会快速排序了吗?

    文章目录 前言 什么是快速排序 快速排序的递归实现 快速排序的非递归实现 单趟排序详解 hoare思想 挖坑法 前后指针法 快速排序的优化 三数取中 小区间优化 快速排序整体代码 尾声 前言 先赞后看 ...

  10. Sea-Search03总结&&un finish

    使用到的设计模式 Facade门面模式 为何使用? 在搜索项目中,由于使用Mvc架构且数据库中各种不同类型的数据源并没有放在同一张表,于是我们不可避免的在Controller中需要注入多个servic ...