当前位置: 首页 > article >正文

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

        在现代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

示例:

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

2.2 数组(Array)

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

示例:

[
  "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) { // 检查响应状态码是否为200
                    const 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)

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;

    @Override
    protected 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"));

            // 设置响应内容类型为JSON
            response.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 Setters
    public 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;

    // Constructor
    public Address(String city, String zipcode) {
        this.city = city;
        this.zipcode = zipcode;
    }

    // Getters and Setters
    public 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格式的用户数据:

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

5. 总结

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


http://www.kler.cn/a/509710.html

相关文章:

  • TiDB 和 MySQL 的关系:这两者到底有什么不同和联系?
  • Go语言之路————条件控制:if、for、switch
  • Sqlmap入门
  • Web前端------表单标签
  • 探索与创作:2024年CSDN平台上的成长与突破
  • SpringBoot:RestTemplate与IllegalArgumentException
  • OpenVela——专为AIoT领域打造的开源操作系统
  • SpringBoot3 升级介绍
  • Hexo + NexT + Github搭建个人博客
  • 解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated
  • 复健第二天之[MoeCTF 2022]baby_file
  • ASP.NET Core中 JWT 实现无感刷新Token
  • Python+Jenkins自动化测试持续集成
  • AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式
  • Java并发10 - ForkJoin并发框架
  • 【开源免费】基于SpringBoot+Vue.JS宠物领养系统(JAVA毕业设计)
  • uni-app vue3 常用页面 组合式api方式
  • PyTorch深度学习实践【刘二大人】之卷积神经网络
  • 网络互联(软件路由器)实验
  • 如何禁用 PySpark 在运行时打印信息
  • Spring Cloud与Spring Boot的关系
  • 【AI论文】Diffusion模型的推理时缩放:超越降噪步骤的缩放策略
  • postman接口请求-post登陆接口+x-www-form-urlencoded
  • 【PyCharm】连接 Git
  • uniapp 地图(map)加载大量自定义坐标卡顿优化
  • 意图颠覆电影行业的视频生成模型:Runway的Gen系列