深入浅出JSON:数据交换的轻量级解决方案

embedded/2025/1/19 11:49:08/

        在现代Web开发中,数据交换是前后端通信的核心。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读、易解析的特点,成为了前后端数据交互的首选格式。本文将详细介绍JSON的定义、数据格式、作用,并结合Axios和JSON给出完整的代码示例。

1. JSON是什么?

        JSON(JavaScript Object Notation)是一种基于文本的轻量级数据交换格式。它源于JavaScript,但独立于编程语言,几乎所有现代编程语言都支持JSON的解析和生成。

JSON的特点:

  • 轻量级:相比于XML,JSON的格式更简洁,数据体积更小。

  • 易读性:JSON采用键值对的形式,结构清晰,易于人类阅读和编写。

  • 易解析:JSON可以被多种编程语言快速解析和生成,尤其在JavaScript中可以直接转换为对象。

2. JSON的数据格式

JSON的数据格式非常简单,主要由以下几种结构组成:

2.1 对象(Object)

        JSON对象是一个无序的键值对集合,用花括号 {} 包裹,键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔。键必须是字符串,值可以是字符串、数字、布尔值、数组、对象或 null

示例:

javascript">{"name": "John","age": 30,"isStudent": false,"address": {"city": "New York","zipcode": "10001"},"hobbies": ["reading", "traveling", "coding"]
}

2.2 数组(Array)

        JSON数组是一个有序的值集合,用方括号 [] 包裹,值之间用逗号 , 分隔。数组中的值可以是字符串、数字、布尔值、对象、数组或 null

示例:

javascript">["apple","banana","cherry"
]

2.3 值(Value)

JSON中的值可以是:

  • 字符串(用双引号 "" 包裹)

  • 数字(整数或浮点数)

  • 布尔值(true 或 false

  • 对象

  • 数组

  • null

3. JSON的作用

JSON的主要作用是作为数据交换格式,广泛应用于以下场景:

  1. 前后端数据交互:前端通过Ajax或Axios发送请求,后端返回JSON格式的数据。

  2. 配置文件:许多应用程序使用JSON格式存储配置信息。

  3. API通信:RESTful API通常使用JSON作为请求和响应的数据格式。

  4. 数据存储:NoSQL数据库(如MongoDB)使用JSON格式存储数据。

4. Axios与JSON结合示例

        Axios是一个基于Promise的HTTP客户端,常用于发送异步请求。它默认支持JSON数据的解析和发送,非常适合与JSON结合使用。

示例场景:

          这个示例展示了如何使用Java Servlet来处理HTTP GET请求,并将用户信息以JSON格式返回给客户端。同时,它也展示了如何在前端使用Axios库来发起HTTP GET请求,并处理返回的JSON数据。

 4.1 前端代码(使用Axios)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Axios与JSON示例</title><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<h1>用户信息</h1>
<button id="getUserBtn">获取用户信息</button>
<div id="userInfo"></div><script>const userInfoDiv = document.getElementById('userInfo'); // 将DOM查询移到外部以减少重复计算document.getElementById('getUserBtn').addEventListener('click', function () {axios.get('/user').then(function (response) {if (response.status === 200) { // 检查响应状态码是否为200const user = response.data;userInfoDiv.innerHTML = `<p>姓名: ${user.name}</p><p>年龄: ${user.age}</p><p>城市: ${user.address.city}</p>`;} else {console.error('请求未成功:', response.status, response.statusText);}}).catch(function (error) {if (error.response) {// 请求已发出但服务器响应的状态码不在2xx范围内console.error('服务器响应错误:', error.response.status, error.response.statusText);} else if (error.request) {// 请求已发出,但没有收到响应console.error('请求发送但未收到响应:', error.request);} else {// 请求设置过程中出错console.error('请求发送出错:', error.message);}console.error('错误配置:', error.config);});});
</script>
</body>
</html>

4.2 后端代码(Java Servlet)

java">package org.example.demo2;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/user")
public class UserServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {// 创建用户对象User user = new User();user.setName("John");user.setAge(30);user.setAddress(new Address("New York", "10001"));// 设置响应内容类型为JSONresponse.setContentType("application/json");response.setCharacterEncoding("UTF-8");// 将用户对象转换为JSON字符串String json = "{\"name\": \"" + user.getName() + "\", \"age\": " + user.getAge() + ", \"address\": {\"city\": \"" + user.getAddress().getCity() + "\", \"zipcode\": \"" + user.getAddress().getZipcode() + "\"}}";// 返回JSON数据response.getWriter().write(json);} catch (Exception e) {// 处理可能的异常response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);response.getWriter().write("{\"error\": \"" + e.getMessage() + "\"}");e.printStackTrace();}}
}class User {private String name;private int age;private Address address;// Getters and Setterspublic String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }public Address getAddress() { return address; }public void setAddress(Address address) { this.address = address; }
}class Address {private String city;private String zipcode;// Constructorpublic Address(String city, String zipcode) {this.city = city;this.zipcode = zipcode;}// Getters and Setterspublic String getCity() { return city; }public void setCity(String city) { this.city = city; }public String getZipcode() { return zipcode; }public void setZipcode(String zipcode) { this.zipcode = zipcode; }
}

4.3 运行结果

  1. 用户点击“获取用户信息”按钮。

  2. 前端通过Axios发送GET请求到 /user

  3. 后端返回JSON格式的用户数据:

javascript">{"name": "John","age": 30,"address": {"city": "New York","zipcode": "10001"}
}

5. 总结

        JSON作为一种轻量级的数据交换格式,在前后端通信中扮演着重要角色。结合Axios,我们可以轻松实现前后端的数据交互。作为Java后端开发者,掌握JSON的生成与解析,能够帮助你构建更加高效、灵活的Web应用。


http://www.ppmy.cn/embedded/155215.html

相关文章

重拾Python学习,先从把python删除开始。。。

自己折腾就是不行啊&#xff0c;屡战屡败&#xff0c;最近终于找到前辈教我 第一步 删除Python 先把前阵子折腾的WSL和VScode删掉。还是得用spyder&#xff0c;跟matlab最像&#xff0c;也最容易入手。 从VScode上搞python&#xff0c;最后安装到appdata上&#xff0c;安装插…

高性能、低成本立体声音频模数转换器—— GC1808,支持掉电和时钟检测低功耗模式

芯片描述: GC1808是一款高性能、低成本立体声音频模数转换器。其集成了64倍过采样率Δ-Σ调制器、数字梳状滤波器、数字高通滤波器。GC1808支持主、从机和两种串行音频数据格式。GC1808支持掉电和时钟检测低功耗模式。且封装形式采用TSSOP14&#xff0c;温度支持-40℃到 85℃。…

接口防篡改+防重放攻击

接口防止重放攻击&#xff1a;重放攻击是指攻击者截获了一次有效请求(如交易请求),并在之后的时间里多次发送相同的请求&#xff0c;从而达到欺骗系统的目的。为了防止重放攻击&#xff0c;通常需要在系统中引入一种机制&#xff0c;使得每个请求都有一个唯一的标识符(如时间戳…

服务端开发模式-vue-element-admin重新整理websocket

一、App.vue修改 <template><div id"app"><router-view /></div> </template><script>import store from ./storeimport {succ} from /utils/message export default {name: App,data() {return {reverseCount:0,}},created() …

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…

endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]

在 EndNote X9 中&#xff0c;将参考文献和文中引用格式更改为编码形式&#xff08;如 [1], [2]&#xff09;需要以下步骤&#xff1a; 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中&#xff0c;字体的选择和使用对最终作品的质量有着重要影响。然而&#xff0c;有时我们可能会遇到包含未知字体的PDF文件&#xff0c;这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题&#xff0c;让我们能够更好地处理这些文件。…

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件&#xff1a; 组件第一次渲染完毕后&#xff0c;无法基于内部的某些操作让组件更新「无法实现自更新」&#xff1b;但是&#xff0c;如果调用它的父组…