Table
ㄧ. 什麼是序列化和反序列化?
簡單來說:序列化和反序列化,可使資料易於儲存和傳輸。
1 2 |
1. 序列化負責將對象 (Object) 轉換為可傳輸的標準格式。 2. 反序列化負責將可傳輸的標準格式轉換成對象 (Object)。 |
如果要在不同的程式語言之間傳遞對象,就必須把對象序列化為標準格式,常見的標準格式有 XML 或 JSON。
而本篇的序列化標準格式會以 JSON 為主:JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式,易於閱讀和編寫,而且可以直接在 Web 頁面中讀取,非常方便。
二. 序列化 (serializing)
1. 使用 Flask 內建 jsonify 函式進行序列化 (serializing)
This function wraps dumps() to add a few enhancements that make life easier. It turns the JSON output into a Response object with the application/json mimetype.
API — Flask Documentation (1.1.x)
Flask 內建的 jsonify 包裝了 Python 內建的 json.dumps 的用法,可以輕鬆將 Python 對象 (例如:字典 dict 或列表 list) 轉換成 JSON-formatted string,並且還會幫你在 Http response 的 header 中加入 content-type = application/json。
▍補充常見的 content-type 如下:
application/json : JSON數據格式
application/pdf :pdf 格式
application/msword : Word 文檔格式
application/x-www-form-urlencoded : 表單默認的提交數據的格式
multipart/form-data : 進行文檔上傳時,需要使用的該格式
筆記 Postman 常見的 Content-type – hobo engineer – Medium
使用 Flask 內建的 jsonify 實作序列化 (serializing) 範例如下:
1 2 3 4 5 6 7 8 |
from flask import Flask, jsonify app = Flask(__name__) @app.route('/', methods=['GET']) def index(): response = jsonify({'msg': 'welcome'}) return response |
2. 使用 Python 內建的 json.dumps 實作序列化 (serializing)
Serialize obj to a JSON-formatted string
API — Flask Documentation (1.1.x)
json — JSON encoder and decoder — Python 3.8.3rc1 documentation
Python 內建的 json.dumps,可以將 Python 對象 (例如:字典 dict 或列表 list) 轉換成 JSON-formatted string,與 Flask jsonify 的差異在於 Http response 時,需自己手動加入 content-type = application/json。
使用 Python 內建的 json.dumps 實作序列化 (serializing) 範例如下:
1 2 3 4 5 6 7 |
from flask import Flask,Response app = Flask(__name__) @app.route('/', methods=['GET']) def index(): return Response(json.dumps({'msg': 'welcome'}), mimetype='application/json') |
3. 使用 Flask 擴充套件 Marshmallow 實作序列化 (serializing)
marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes.
marshmallow: simplified object serialization — marshmallow 3.6.0 documentation
▍安裝 marshmallow
1 |
$ pip install marshmallow |
▍第一步:建立 Schema 欄位
待會將會使用 Schema 來當作轉換規範,而 marshmallow 建立 Schema 有兩種方法
1 2 3 4 5 6 7 8 9 10 11 12 |
from marshmallow import Schema, fields # 方法一 defining a class class UserSchema(Schema): name = fields.Str() email = fields.Email() created_at = fields.DateTime() # 方法二 from a dictionary UserSchema = Schema.from_dict( {"name": fields.Str(), "email": fields.Email(), "created_at": fields.DateTime()} ) |
▍第二步:使用 Schema 進行序列化
Marshmallow 序列化可使用 schema.dump() 或 schema.dumps():
- schema.dump() 方法實現 obj -> dict
- schema.dumps() 方法實現 obj -> JSON-formatted string
1 2 3 4 5 6 7 8 9 |
# 實例化剛剛建立的 Schema schema = UserSchema() # 使用 schema.dump() 放入要序列化的數據 user dict_result = schema.dump(user) # obj -> dict json_result = schema.dumps(user) # obj -> JSON print(dict_result) print(json_result) |
三. 反序列化 (deserializing)
1. 使用 Python 內建的 json.loads 實作反序列化 (deserializing)
可以將 JSON-formatted string 轉換成 Python 對象 (例如:字典 dict 或列表 list)
Python JSON | 菜鸟教程
使用 Python 內建的 json.loads 實作序列化 (deserializing) 範例如下:
1 2 3 4 5 |
import json jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; text = json.loads(jsonData) |
2. 使用 Flask 擴充套件 Marshmallow 實作序反列化 (deserializing)
▍安裝 marshmallow
1 |
$ pip install marshmallow |
▍第一步:建立 Schema 欄位
實作方式和剛剛一樣都需要先建立 Schema 欄位,而建立 Schema 有兩種方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
from marshmallow import Schema, fields # 方法一 defining a class class UserSchema(Schema): name = fields.Str() email = fields.Email() created_at = fields.DateTime() # 方法二 from a dictionary UserSchema = Schema.from_dict( {"name": fields.Str(), "email": fields.Email(), "created_at": fields.DateTime()} ) |
▍第二步:使用 Schema 進行反序列化
Marshmallow 反序列化可使用 schema.load() 或 schema.loads():
1. schema.load() 方法實現 dict -> obj
2. schema.loads() 方法實現 JSON-formatted string -> obj
1 2 3 4 5 6 7 8 9 |
# 實例化剛剛建立的 Schema schema = UserSchema() # 使用 schema.load() 放入要反序列化的數據 user dict_result = schema.load(user) # dict -> obj json_result = schema.loads(user) # JSON -> obj print(dict_result) print(json_result) |
最後~
▍回顧一下本篇實作 marshmallow 和 jsonify 序列化的重點:
- 什麼是序列化和反序列化?
- 序列化 (serializing)
- Flask 內建 jsonify 函式進行序列化
- Python 內建的 json.dumps 實作序列化
- Flask 擴充套件 Marshmallow 實作序列化
- 反序列化 (deserializing)
- Python 內建的 json.loads 實作反序列化
- Flask 擴充套件 Marshmallow 實作序反列化
關於 Flask 教學的延伸閱讀:
▍關於 Flask 教學系列目錄:
▍其他 Flask 相關教學:
- 【Flask教學系列】Flask 為甚麼需要 WSGI 與 Nginx
- 【Flask教學系列】Flask-JWT-Extended 實作
- 【Flask教學系列】實作 Flask CORS
- 【Flask教學系列】實作 Flask CSRF Protection
- 【Flask教學系列】實作 Dockerfile + nginx + ssl + Flask 教學 (附GitHub完整程式)
那【Flask教學系列】實作 Flask 序列化 和 反序列化 方法 就到這邊,感謝收看,如果有任何問題歡迎留言唷!