创新项目实训记录(五)

#json序列化#

背景

        因为我们有两个后端,一个是java的springboot,一个是python的flask,所以我们经常需要在两个后端间通信,一开始知识传输简单的字符串,并没有意识到这个问题,但是在从flask打包字典传给java时,发现在java端接受到的数据无法正常显示,这才意识到数据传输会json序列化。

为什么服务器给客户端发送的数据需要json序列化?

  1. 数据传输格式标准化:
    JSON是一种轻量级的数据交换格式,已经成为Web开发中事实上的标准。使用JSON序列化可以确保服务器和客户端之间使用统一的数据格式进行通信,提高了数据传输的标准化和可读性。

  2. 系统异构性兼容:
    通过JSON序列化,服务器可以将各种数据类型(如数字、字符串、对象等)转换为标准的JSON格式,这样即使客户端使用不同的编程语言或系统,也能够轻松地解析和处理接收到的数据。这增强了系统之间的异构性兼容性。

  3. 数据压缩和传输效率:
    相比于原始的数据格式,JSON序列化后的数据通常体积更小,在网络传输过程中可以提高传输效率,减少带宽占用。这对于移动设备等带宽受限的场景尤其重要。

  4. 安全性和可靠性:
    JSON格式具有较强的安全性和可靠性。它不容易受到注入攻击等安全问题的影响,并且可以通过验证JSON数据的格式和结构来确保数据的完整性。

Python中如何将数据打包成json?

Flask 中的 jsonify 函数是一个非常有用的工具,它用于将 Python 对象转换为 JSON 格式的响应。

  1. 功能:

    • 将 Python 对象(如字典、列表、数字等)转换为 JSON 格式的响应。
    • 自动设置 Content-Type 头为 application/json
    • 支持 UTF-8 编码。
  2. 使用方法:

    • 在 Flask 路由函数中返回 jsonify 的结果:
      from flask import jsonify
      
      @app.route('/api/data')
      def get_data():
          data = {'name': 'John Doe', 'age': 30}
          return jsonify(data)
      
    • 也可以将多个参数传递给 jsonify:
      @app.route('/api/users')
      def get_users():
          users = [
              {'id': 1, 'name': 'John'},
              {'id': 2, 'name': 'Jane'},
              {'id': 3, 'name': 'Bob'}
          ]
          return jsonify(users=users)
      
  3. 优点:

    • 简化了 JSON 响应的生成过程,减少了手动序列化和设置头部的工作。
    • 确保了响应的正确性和一致性,避免了手动编码可能产生的错误。
    • 与 Flask 的其他特性(如路由、模板等)集成良好,提高了开发效率。
  4. 注意事项:

    • jsonify 只能处理一些常见的 Python 数据类型,如果需要序列化更复杂的对象,可能需要手动编码。
    • 在处理大量数据时,直接使用 json.dumps 可能会更高效一些。

在java端如何反序列化?

  1. 使用 Gson 库:
    Gson 是 Google 推出的一个 Java 库,用于进行 JSON 的序列化和反序列化。

    Gson gson = new Gson();
    JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class);
    MyClass myObject = gson.fromJson(jsonString, MyClass.class);
    
  2. 使用 Jackson 库:
    Jackson 是另一个广泛使用的 Java JSON 处理库。

    ObjectMapper mapper = new ObjectMapper();
    JsonNode jsonNode = mapper.readTree(jsonString);
    MyClass myObject = mapper.readValue(jsonString, MyClass.class);
    
  3. 使用 org.json 库:
    Java 标准库中自带了一个 org.json 包,可以用于 JSON 的解析。

    JSONObject jsonObject = new JSONObject(jsonString);
    String name = jsonObject.getString("name");
    int age = jsonObject.getInt("age");
    
  4. 使用 Java 原生 API:
    Java 8 引入了 java.util.json 包,提供了原生的 JSON 处理能力。

    JsonReader reader = Json.createReader(new StringReader(jsonString));
    JsonObject jsonObject = reader.readObject();
    String name = jsonObject.getString("name");
    int age = jsonObject.getInt("age");
    

无论使用哪种方式,反序列化的一般步骤如下:

  1. 获取 JSON 字符串数据。
  2. 创建相应的反序列化对象(如 Gson、Jackson 的 ObjectMapper 等)。
  3. 调用反序列化方法,将 JSON 字符串转换为 Java 对象。

为什么在 Vue.js 与 Spring Boot 之间传输数据的过程中,通常不会显式地看到 JSON 序列化的过程?

这是因为现代 Web 框架已经封装了这些底层的数据传输细节。

以下是 Vue.js 与 Spring Boot 之间数据传输的一般流程:

  1. 前端 (Vue.js):

    • 当用户在 Vue.js 应用程序中触发某个操作(如点击按钮、提交表单)时,Vue.js 组件会发起一个 HTTP 请求,通常使用 Axios 或 Vue Resource 等 HTTP 客户端库。
    • 在发起请求时,Vue.js 会自动将 JavaScript 对象转换为 JSON 格式的数据,并设置 Content-Type 头为 application/json
  2. 后端 (Spring Boot):

    • Spring Boot 的 REST 控制器会接收来自前端的 JSON 格式数据。
    • Spring 的 @RequestBody 注解会自动将 JSON 数据反序列化为 Java 对象,开发者可以直接在方法参数中使用这个 Java 对象进行后续操作。
  3. 数据处理:

    • Spring Boot 控制器方法中的 Java 对象会被处理、修改或保存到数据库中。
    • 当需要返回数据给前端时,Spring Boot 会自动将 Java 对象序列化为 JSON 格式,并设置 Content-Type 头为 application/json
  4. 前端 (Vue.js):

    • 在 Vue.js 中,当接收到 Spring Boot 返回的 JSON 数据时,Axios 或 Vue Resource 会自动将 JSON 数据解析为 JavaScript 对象,开发者可以直接使用这个对象进行数据绑定和展示。
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值