⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:Java Web
目录
1、简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是基于JavaScript语言的一种语法扩展。JSON最初是为了在客户端和服务端之间传递数据而设计的,但现在已经成为了一种通用的数据格式。
JSON的语法非常简单,它主要由两种数据结构组成:键值对和数组。键值对由一个键和一个对应的值组成,键和值之间使用冒号分隔,不同的键值对之间使用逗号分隔。数组则是一组值的有序集合,每个值之间同样使用逗号分隔。
JSON数据可以表示简单的数据类型,如数字、字符串、布尔值和null值,同时也可以表示复杂的数据类型,如对象和数组。JSON还支持嵌套和组合,因此可以表示非常复杂的数据结构。
2、JSON和JS的区别
JSON(JavaScript Object Notation)和JS(JavaScript)是两个不同的概念。
JSON是一种轻量级的数据交换格式,它是基于JavaScript语言的一种语法扩展,因此具有与JavaScript类似的语法结构。JSON主要用于在客户端和服务端之间传递数据,是一种通用的数据格式。
JS是一种脚本语言,它可以在Web浏览器中运行,可以用于开发动态的Web应用程序,包括交互式的用户界面、动态效果和数据交互等功能。JS包含了一系列的内置对象和方法,可以操作HTML文档、响应用户交互、发送网络请求等功能。
因此,JSON是一种数据格式,用于在不同系统之间传递数据;而JS是一种脚本语言,用于在Web浏览器中开发Web应用程序。虽然JSON和JS具有相似的语法结构,但它们的用途和作用域是不同的。
3、基础语法
3.1、格式
JSON 本质是一个字符串,但是该字符串内容是有格式要求的。
定义格式如下:
JSON 串的键要求必须使用双引号括起来,而值根据要表示的类型确定。value 的数据类型分为如下:
- 数字(整数或浮点数)
- 字符串(使用双引号括起来)
- 逻辑值(true或者nfalse)
- 数组(在方括号中)
- 对象(在花括号中)
- null
3.2、简单代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//1、定义一个JSON格式的字符串
var jsonString = '{"name":"zhangsan","age":18,"address":["某个城市","某个区"]}';
alert(jsonString);
</script>
</body>
</html>
效果如下:
3.2.1、获取值
之前获取js对象的值,是采用js对象.属性名的方式获取对应的数据。
同时JS也提供了一个对象JSON,对象方法如下:
- parse(str) :将 JSON字符串转换为 js 对象。使用方式->var jsObject = JSON.parse(jsonStr);
- stringify(obj) :将 js 对象转换为 JSON 串。使用方式->var jsonStr = JSON.stringify(jsObject)
代码演示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//1、定义一个JSON格式的字符串
var jsonString = '{"name":"zhangsan","age":18,"address":["某个城市","某个区"]}';
alert(jsonString);
//2、把JSON转为JS对象
let jsObject = JSON.parse(jsonString);
for (var key in jsObject) {
if (jsObject.hasOwnProperty(key)) {
alert(key);
}
}
//3、把JS转为JSON
alert(JSON.stringify(jsObject));
</script>
</body>
</html>
3.3、发送异步请求
在使用 axios 发送请求时,如果要携带复杂的数据时都会以 JSON 格式进行传递,如下:
data的请求参数是不需要去手动拼接的,可以提前定义一个 js 对象,用来封装需要提交的参数,然后使用 JSON.stringify(js对象) 转换为 JSON 串,再将该 JSON 串作为 axios 的 data 属性值进行请求参数的提交。
代码还可以简化:
只需要将需要提交的参数封装成 js 对象,并将该 js 对象作为 axios 的 data 属性值,axios会自动将 js 对象转换为 JSON 串进行提交
4、应用场景
JSON(JavaScript Object Notation)具有以下几个应用场景:
- 数据交换:JSON是一种轻量级的数据交换格式,通常用于在不同的系统之间传递数据。它被广泛应用于Web应用程序和API中,以及移动应用程序和其他各种应用程序中。
- 存储配置数据:JSON可以用来存储和读取配置数据。例如,在一些应用程序中,可以使用JSON格式来存储用户的偏好设置或应用程序的配置信息。
- 存储日志数据:JSON可以用来存储和分析日志数据。例如,在Web应用程序中,可以使用JSON格式来存储用户访问日志或错误日志。
5、优缺点
JSON的优点包括:
- 简洁清晰:JSON的语法结构简单,易于读写和理解。它使用键值对和数组等数据结构,支持嵌套和组合,可以表示非常复杂的数据结构。
- 跨平台支持:由于JSON是一种通用的数据格式,因此被广泛用于Web应用程序和API中,以及移动应用程序和其他各种应用程序中。它可以跨平台使用,不受语言和系统的限制。
- 解析速度快:JSON的解析速度快,可以快速地将数据转换为对象或数组等数据类型。
JSON的缺点包括:
- 不适合存储大量数据:由于JSON是一种文本格式,因此不适合存储大量的数据。当需要存储大量数据时,可以考虑使用其他格式,如二进制格式。
- 不支持注释:JSON不支持注释,因此在需要注释数据时,必须将注释信息嵌入到键或值中,会影响数据的可读性。
- 不支持自定义类型:JSON只支持JavaScript中的一些基本数据类型,如字符串、数字、布尔值、数组和对象等,不支持自定义类型。
6、🔺JSON和Java对象相互转换
在前后端数据进行交互的过程中,作为后端开发人员,后端需要掌握的操作为:
- 请求数据:JSON字符串转为Java对象
- 响应数据:Java对象转为JSON字符串
实现方式:使用Fastjson的这个API
6.1、⭐Fastjson概述
Fastjson 是阿里巴巴提供的一个Java语言编写的高性能功能完善的 JSON 库,是目前Java语言中最快的 JSON 库,可以实现 Java 对象和 JSON 字符串的相互转换。
Fastjson提供了一些特殊的功能,使得它成为一个高效、可靠的JSON处理器/库,如:
- 快速解析和生成JSON数据:Fastjson提供了高效的解析器和生成器,可以快速处理大量的JSON数据,使得Fastjson成为一个高性能的JSON处理器/库。
- 对象自动序列化:Fastjson可以自动将Java对象序列化为JSON格式的数据,并且支持自定义序列化规则。
- 支持复杂数据类型:Fastjson可以处理Java对象中包含的复杂数据类型,如数组、集合、枚举等。
- 支持注解:Fastjson支持注解,可以通过注解来控制序列化和反序列化过程中的行为。
6.2、使用Fastjson
使用步骤如下:
- 导入依赖
- Java对象转JSON
- JSON转Java对象
①导入需要的驱动包,这里直接使用maven坐标的形式:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
②Java对象转JSON->String jsonStr = JSON.toJSONString(obj);
③JSON转Java对象->User user = JSON.parseObject(jsonStr, User.class);
完整代码如下:
package com.xzl.web;
import com.alibaba.fastjson.JSON;
/**
* @author 逐梦苍穹
* @date 2023/4/3 15:48
*/
public class FastJsonDemo {
public static void main(String[] args) {
//1. 将Java对象转为JSON字符串
User user = new User();
user.setId(1);
user.setUsername("zhangsan");
user.setPassword("123");
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
//2. 将JSON字符串转为Java对象
User u = JSON.parseObject(jsonString, User.class);
System.out.println(u.toString());
}
}
class User{
private int id;
private String username;
private String pass_w_D;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", pass_W_D='" + pass_w_D + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return pass_w_D;
}
public void setPassword(String password) {
this.pass_w_D = password;
}
}
控制台输出: