Python使用Marshmallow輕松實現序列化和反序列化
可能很多Python開發(fā)者都遇到過——序列化。你可能會問:花姐,序列化有什么好聊的?這不就是把對象轉成字符串、從字符串轉回來嗎?對啊,沒錯,序列化確實這么簡單。但是,當你一開始使用Python自帶的json
庫時,可能會覺得很方便。但慢慢地,你會發(fā)現,它的功能有點單薄,特別是在一些復雜的數據處理場景中。今天就讓我來給大家普及一下,為什么我放棄了json
,而選擇了功能更強大的Marshmallow!
為什么放棄json庫
json庫的局限性
大家都知道,json
是Python內置的庫,支持將Python對象轉為JSON格式的字符串(序列化),以及將JSON字符串轉回Python對象(反序列化)。這在日常開發(fā)中確實夠用,尤其是對于簡單的字典、列表和字符串。但當你的數據結構變得復雜時,json
的局限性就暴露出來了。
舉個例子,假設你有一個對象,需要序列化成JSON格式,但這個對象不僅僅是普通的字典,它可能嵌套了其他對象,或者你希望在序列化時有一些特定的字段驗證、格式化,甚至是嵌套對象的轉換——這個時候,json
庫就力不從心了。
Marshmallow,拯救我!
這時候,Marshmallow應運而生!它不僅可以輕松地進行序列化和反序列化,還支持對象驗證、字段轉換、數據清洗等強大功能。簡直就是復雜數據操作的“超級英雄”!
Marshmallow入門:如何用Marshmallow序列化和反序列化數據
安裝Marshmallow
首先,我們來安裝Marshmallow。打開你的終端,執(zhí)行以下命令:
pip install marshmallow
定義Schema
Marshmallow的核心概念是Schema。你可以通過定義Schema來指定如何將Python對象序列化為JSON,以及如何將JSON反序列化為Python對象。
舉個例子,假設你有一個User
類,需要將其轉換成JSON格式:
from marshmallow import Schema, fields class User: def __init__(self, name, age, email): self.name = name self.age = age self.email = email class UserSchema(Schema): name = fields.Str() age = fields.Int() email = fields.Email() # 創(chuàng)建一個User對象 user = User(name="小李", age=30, email="xiaoli@example.com") # 創(chuàng)建UserSchema實例 user_schema = UserSchema() # 序列化對象(User -> JSON) user_json = user_schema.dump(user) print(user_json)
這里,我們定義了一個User
類和一個UserSchema
類,UserSchema
繼承自marshmallow.Schema
,并通過fields
模塊定義了我們希望序列化的字段(name
、age
和email
)。
通過dump()
方法,我們將User
對象轉換成了一個JSON兼容的字典格式。打印出來的結果大概是這樣的:
{'name': '小李', 'age': 30, 'email': 'xiaoli@example.com'}
反序列化:從JSON到Python對象
除了序列化,Marshmallow還支持反序列化,也就是將JSON轉換回Python對象。下面是如何做的:
# 反序列化(JSON -> User對象) user_data = {'name': '小周', 'age': 28, 'email': 'xiaozhou@example.com'} user_obj = user_schema.load(user_data) print(user_obj)
輸出將會是一個字典:
{'name': '小周', 'age': 28, 'email': 'xiaozhou@example.com'}
這時候,你的Python對象就可以正常使用了!Marshmallow會自動把輸入的JSON轉換成Python對象,并進行驗證。非常方便!
Marshmallow進階:驗證與字段轉換
字段驗證
在日常開發(fā)中,我們通常希望確保傳入的數據是合法的,比如用戶名不能為空,年齡必須是正數。Marshmallow支持多種驗證功能,通過fields
模塊的validators可以輕松實現。
例如,我們希望確保用戶的年齡是大于0的:
from marshmallow import Schema, fields, validate class UserSchema(Schema): name = fields.Str(required=True) age = fields.Int(required=True, validate=validate.Range(min=1)) email = fields.Email(required=True) # 創(chuàng)建UserSchema實例 user_schema = UserSchema() # 測試數據 user_data = {'name': '小李', 'age': -5, 'email': 'xiaoli@example.com'} try: user = user_schema.load(user_data) except Exception as e: print(e) #{'age': ['Must be greater than or equal to 1.']}
如果年齡小于1,Marshmallow會拋出驗證錯誤,提示我們“年齡必須大于等于1”。這就是字段驗證的強大之處!
字段轉換
除了驗證,Marshmallow還支持對字段進行轉換。例如,我們可以將一個字符串轉換為日期格式,或者將數字轉換為貨幣格式等。
from marshmallow import Schema, fields class EventSchema(Schema): name = fields.Str() date = fields.Date() # 反序列化時,Marshmallow會自動將字符串轉為日期對象 event_data = {'name': 'Python大會', 'date': '2025-01-21'} event_schema = EventSchema() event_obj = event_schema.load(event_data) print(event_obj)
輸出結果會是:
{'name': 'Python大會', 'date': datetime.date(2025, 1, 21)}
是不是很方便?通過這種方式,你可以輕松地處理各種數據格式和轉換!
Marshmallow的高級特性:嵌套Schema和自定義序列化
嵌套Schema
有時候,我們的對象不僅僅是簡單的字段,它們可能會嵌套其他對象。Marshmallow也能輕松處理這一點!通過定義嵌套的Schema
,你可以在一個對象中包含其他對象的數據。
例如:
from marshmallow import Schema, fields # 定義Address的Schema class AddressSchema(Schema): province = fields.Str() #省 city = fields.Str() #市 # 定義User的Schema,包含嵌套的AddressSchema class UserSchema(Schema): name = fields.Str() age = fields.Int() address = fields.Nested(AddressSchema()) # 創(chuàng)建Address對象數據 user_address = dict(province="河北省",city="邯鄲市") # 創(chuàng)建User對象數據,其中包含Artist對象 user = dict(name="花姐", age=18,address=user_address) # 創(chuàng)建UserSchema實例 schema = UserSchema() # 使用dump方法序列化數據 result = schema.dump(user) # 打印序列化結果 print(result)
輸出結果會是:
{'name': '花姐', 'age': 18, 'address': {'province': '河北省', 'city': '邯鄲市'}}
這個例子展示了如何在UserSchema
中嵌套另一個AddressSchema
,通過fields.Nested()
實現對象的嵌套序列化。你可以輕松地序列化復雜的對象結構。
總結
Marshmallow在Python的序列化和反序列化處理中提供了極大的靈活性和強大的功能。從基本的對象轉換到復雜的數據驗證、嵌套序列化,它都能輕松搞定。比起json
庫,Marshmallow更適合處理復雜的對象結構、字段驗證和格式轉換,讓你在處理數據時更加得心應手。
當然,Marshmallow也不是完美無缺的,它的學習曲線可能相對json
稍微陡峭一些,但一旦掌握,你會發(fā)現它在工作中無比強大,幾乎是一個Python開發(fā)者的“必備神器”!
到此這篇關于Python使用Marshmallow輕松實現序列化和反序列化的文章就介紹到這了,更多相關Python Marshmallow序列化和反序列化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
YOLOv5在圖片上顯示統(tǒng)計出單一檢測目標的個數實例代碼
各位讀者首先要認識到的問題是,在YOLOv5中完成錨框計數是一件非常簡單的工作,下面這篇文章主要給大家介紹了關于YOLOv5如何在圖片上顯示統(tǒng)計出單一檢測目標的個數的相關資料,需要的朋友可以參考下2023-03-03淺談Matplotlib簡介和pyplot的簡單使用——文本標注和箭頭
這篇文章主要介紹了淺談Matplotlib簡介和pyplot的簡單使用——文本標注和箭頭,具有一定借鑒價值,需要的朋友可以參考下2018-01-01ubuntu17.4下為python和python3裝上pip的方法
今天小編就為大家分享一篇ubuntu17.4下為python和python3裝上pip的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python讀取xlsx文件報錯:xlrd.biffh.XLRDError:?Excel?xlsx?file;no
這篇文章主要給大家介紹了關于Python庫xlrd中的xlrd.open_workbook()函數讀取xlsx文件報錯:xlrd.biffh.XLRDError:?Excel?xlsx?file;not?supported問題解決的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-08-08