#json序列化#
背景
因为我们有两个后端,一个是java的springboot,一个是python的flask,所以我们经常需要在两个后端间通信,一开始知识传输简单的字符串,并没有意识到这个问题,但是在从flask打包字典传给java时,发现在java端接受到的数据无法正常显示,这才意识到数据传输会json序列化。
为什么服务器给客户端发送的数据需要json序列化?
-
数据传输格式标准化:
JSON是一种轻量级的数据交换格式,已经成为Web开发中事实上的标准。使用JSON序列化可以确保服务器和客户端之间使用统一的数据格式进行通信,提高了数据传输的标准化和可读性。 -
系统异构性兼容:
通过JSON序列化,服务器可以将各种数据类型(如数字、字符串、对象等)转换为标准的JSON格式,这样即使客户端使用不同的编程语言或系统,也能够轻松地解析和处理接收到的数据。这增强了系统之间的异构性兼容性。 -
数据压缩和传输效率:
相比于原始的数据格式,JSON序列化后的数据通常体积更小,在网络传输过程中可以提高传输效率,减少带宽占用。这对于移动设备等带宽受限的场景尤其重要。 -
安全性和可靠性:
JSON格式具有较强的安全性和可靠性。它不容易受到注入攻击等安全问题的影响,并且可以通过验证JSON数据的格式和结构来确保数据的完整性。
Python中如何将数据打包成json?
Flask 中的 jsonify
函数是一个非常有用的工具,它用于将 Python 对象转换为 JSON 格式的响应。
-
功能:
- 将 Python 对象(如字典、列表、数字等)转换为 JSON 格式的响应。
- 自动设置
Content-Type
头为application/json
。 - 支持 UTF-8 编码。
-
使用方法:
- 在 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)
- 在 Flask 路由函数中返回
-
优点:
- 简化了 JSON 响应的生成过程,减少了手动序列化和设置头部的工作。
- 确保了响应的正确性和一致性,避免了手动编码可能产生的错误。
- 与 Flask 的其他特性(如路由、模板等)集成良好,提高了开发效率。
-
注意事项:
jsonify
只能处理一些常见的 Python 数据类型,如果需要序列化更复杂的对象,可能需要手动编码。- 在处理大量数据时,直接使用
json.dumps
可能会更高效一些。
在java端如何反序列化?
-
使用 Gson 库:
Gson 是 Google 推出的一个 Java 库,用于进行 JSON 的序列化和反序列化。Gson gson = new Gson(); JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class); MyClass myObject = gson.fromJson(jsonString, MyClass.class);
-
使用 Jackson 库:
Jackson 是另一个广泛使用的 Java JSON 处理库。ObjectMapper mapper = new ObjectMapper(); JsonNode jsonNode = mapper.readTree(jsonString); MyClass myObject = mapper.readValue(jsonString, MyClass.class);
-
使用 org.json 库:
Java 标准库中自带了一个 org.json 包,可以用于 JSON 的解析。JSONObject jsonObject = new JSONObject(jsonString); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age");
-
使用 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");
无论使用哪种方式,反序列化的一般步骤如下:
- 获取 JSON 字符串数据。
- 创建相应的反序列化对象(如 Gson、Jackson 的 ObjectMapper 等)。
- 调用反序列化方法,将 JSON 字符串转换为 Java 对象。
为什么在 Vue.js 与 Spring Boot 之间传输数据的过程中,通常不会显式地看到 JSON 序列化的过程?
这是因为现代 Web 框架已经封装了这些底层的数据传输细节。
以下是 Vue.js 与 Spring Boot 之间数据传输的一般流程:
-
前端 (Vue.js):
- 当用户在 Vue.js 应用程序中触发某个操作(如点击按钮、提交表单)时,Vue.js 组件会发起一个 HTTP 请求,通常使用 Axios 或 Vue Resource 等 HTTP 客户端库。
- 在发起请求时,Vue.js 会自动将 JavaScript 对象转换为 JSON 格式的数据,并设置
Content-Type
头为application/json
。
-
后端 (Spring Boot):
- Spring Boot 的 REST 控制器会接收来自前端的 JSON 格式数据。
- Spring 的
@RequestBody
注解会自动将 JSON 数据反序列化为 Java 对象,开发者可以直接在方法参数中使用这个 Java 对象进行后续操作。
-
数据处理:
- Spring Boot 控制器方法中的 Java 对象会被处理、修改或保存到数据库中。
- 当需要返回数据给前端时,Spring Boot 会自动将 Java 对象序列化为 JSON 格式,并设置
Content-Type
头为application/json
。
-
前端 (Vue.js):
- 在 Vue.js 中,当接收到 Spring Boot 返回的 JSON 数据时,Axios 或 Vue Resource 会自动将 JSON 数据解析为 JavaScript 对象,开发者可以直接使用这个对象进行数据绑定和展示。