最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用Marshmallow輕松實(shí)現(xiàn)序列化和反序列化

 更新時(shí)間:2025年03月05日 11:22:54   作者:花小姐的春天  
這篇文章主要為大家詳細(xì)介紹了Python如何使用Marshmallow輕松實(shí)現(xiàn)序列化和反序列化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

可能很多Python開發(fā)者都遇到過(guò)——序列化。你可能會(huì)問(wèn):花姐,序列化有什么好聊的?這不就是把對(duì)象轉(zhuǎn)成字符串、從字符串轉(zhuǎn)回來(lái)嗎?對(duì)啊,沒(méi)錯(cuò),序列化確實(shí)這么簡(jiǎn)單。但是,當(dāng)你一開始使用Python自帶的json庫(kù)時(shí),可能會(huì)覺(jué)得很方便。但慢慢地,你會(huì)發(fā)現(xiàn),它的功能有點(diǎn)單薄,特別是在一些復(fù)雜的數(shù)據(jù)處理場(chǎng)景中。今天就讓我來(lái)給大家普及一下,為什么我放棄了json,而選擇了功能更強(qiáng)大的Marshmallow!

為什么放棄json庫(kù)

json庫(kù)的局限性

大家都知道,json是Python內(nèi)置的庫(kù),支持將Python對(duì)象轉(zhuǎn)為JSON格式的字符串(序列化),以及將JSON字符串轉(zhuǎn)回Python對(duì)象(反序列化)。這在日常開發(fā)中確實(shí)夠用,尤其是對(duì)于簡(jiǎn)單的字典、列表和字符串。但當(dāng)你的數(shù)據(jù)結(jié)構(gòu)變得復(fù)雜時(shí),json的局限性就暴露出來(lái)了。

舉個(gè)例子,假設(shè)你有一個(gè)對(duì)象,需要序列化成JSON格式,但這個(gè)對(duì)象不僅僅是普通的字典,它可能嵌套了其他對(duì)象,或者你希望在序列化時(shí)有一些特定的字段驗(yàn)證、格式化,甚至是嵌套對(duì)象的轉(zhuǎn)換——這個(gè)時(shí)候,json庫(kù)就力不從心了。

Marshmallow,拯救我!

這時(shí)候,Marshmallow應(yīng)運(yùn)而生!它不僅可以輕松地進(jìn)行序列化和反序列化,還支持對(duì)象驗(yàn)證、字段轉(zhuǎn)換、數(shù)據(jù)清洗等強(qiáng)大功能。簡(jiǎn)直就是復(fù)雜數(shù)據(jù)操作的“超級(jí)英雄”!

Marshmallow入門:如何用Marshmallow序列化和反序列化數(shù)據(jù)

安裝Marshmallow

首先,我們來(lái)安裝Marshmallow。打開你的終端,執(zhí)行以下命令:

pip install marshmallow

定義Schema

Marshmallow的核心概念是Schema。你可以通過(guò)定義Schema來(lái)指定如何將Python對(duì)象序列化為JSON,以及如何將JSON反序列化為Python對(duì)象。

舉個(gè)例子,假設(shè)你有一個(gè)User類,需要將其轉(zhuǎn)換成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)建一個(gè)User對(duì)象
user = User(name="小李", age=30, email="xiaoli@example.com")

# 創(chuàng)建UserSchema實(shí)例
user_schema = UserSchema()

# 序列化對(duì)象(User -> JSON)
user_json = user_schema.dump(user)
print(user_json)

這里,我們定義了一個(gè)User類和一個(gè)UserSchema類,UserSchema繼承自marshmallow.Schema,并通過(guò)fields模塊定義了我們希望序列化的字段(name、ageemail)。

通過(guò)dump()方法,我們將User對(duì)象轉(zhuǎn)換成了一個(gè)JSON兼容的字典格式。打印出來(lái)的結(jié)果大概是這樣的:

{'name': '小李', 'age': 30, 'email': 'xiaoli@example.com'}

反序列化:從JSON到Python對(duì)象

除了序列化,Marshmallow還支持反序列化,也就是將JSON轉(zhuǎn)換回Python對(duì)象。下面是如何做的:

# 反序列化(JSON -> User對(duì)象)
user_data = {'name': '小周', 'age': 28, 'email': 'xiaozhou@example.com'}
user_obj = user_schema.load(user_data)
print(user_obj)

輸出將會(huì)是一個(gè)字典:

{'name': '小周', 'age': 28, 'email': 'xiaozhou@example.com'}

這時(shí)候,你的Python對(duì)象就可以正常使用了!Marshmallow會(huì)自動(dòng)把輸入的JSON轉(zhuǎn)換成Python對(duì)象,并進(jìn)行驗(yàn)證。非常方便!

Marshmallow進(jìn)階:驗(yàn)證與字段轉(zhuǎn)換

字段驗(yàn)證

在日常開發(fā)中,我們通常希望確保傳入的數(shù)據(jù)是合法的,比如用戶名不能為空,年齡必須是正數(shù)。Marshmallow支持多種驗(yàn)證功能,通過(guò)fields模塊的validators可以輕松實(shí)現(xiàn)。

例如,我們希望確保用戶的年齡是大于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實(shí)例
user_schema = UserSchema()
# 測(cè)試數(shù)據(jù)
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會(huì)拋出驗(yàn)證錯(cuò)誤,提示我們“年齡必須大于等于1”。這就是字段驗(yàn)證的強(qiáng)大之處!

字段轉(zhuǎn)換

除了驗(yàn)證,Marshmallow還支持對(duì)字段進(jìn)行轉(zhuǎn)換。例如,我們可以將一個(gè)字符串轉(zhuǎn)換為日期格式,或者將數(shù)字轉(zhuǎn)換為貨幣格式等。

from marshmallow import Schema, fields

class EventSchema(Schema):
    name = fields.Str()
    date = fields.Date()

# 反序列化時(shí),Marshmallow會(huì)自動(dòng)將字符串轉(zhuǎn)為日期對(duì)象
event_data = {'name': 'Python大會(huì)', 'date': '2025-01-21'}
event_schema = EventSchema()
event_obj = event_schema.load(event_data)
print(event_obj)

輸出結(jié)果會(huì)是:

{'name': 'Python大會(huì)', 'date': datetime.date(2025, 1, 21)}

是不是很方便?通過(guò)這種方式,你可以輕松地處理各種數(shù)據(jù)格式和轉(zhuǎn)換!

Marshmallow的高級(jí)特性:嵌套Schema和自定義序列化

嵌套Schema

有時(shí)候,我們的對(duì)象不僅僅是簡(jiǎn)單的字段,它們可能會(huì)嵌套其他對(duì)象。Marshmallow也能輕松處理這一點(diǎn)!通過(guò)定義嵌套的Schema,你可以在一個(gè)對(duì)象中包含其他對(duì)象的數(shù)據(jù)。

例如:

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對(duì)象數(shù)據(jù)
user_address = dict(province="河北省",city="邯鄲市")

# 創(chuàng)建User對(duì)象數(shù)據(jù),其中包含Artist對(duì)象
user = dict(name="花姐", age=18,address=user_address)

# 創(chuàng)建UserSchema實(shí)例
schema = UserSchema()

# 使用dump方法序列化數(shù)據(jù)
result = schema.dump(user)

# 打印序列化結(jié)果
print(result)

輸出結(jié)果會(huì)是:

{'name': '花姐', 'age': 18, 'address': {'province': '河北省', 'city': '邯鄲市'}}

這個(gè)例子展示了如何在UserSchema中嵌套另一個(gè)AddressSchema,通過(guò)fields.Nested()實(shí)現(xiàn)對(duì)象的嵌套序列化。你可以輕松地序列化復(fù)雜的對(duì)象結(jié)構(gòu)。

總結(jié)

Marshmallow在Python的序列化和反序列化處理中提供了極大的靈活性和強(qiáng)大的功能。從基本的對(duì)象轉(zhuǎn)換到復(fù)雜的數(shù)據(jù)驗(yàn)證、嵌套序列化,它都能輕松搞定。比起json庫(kù),Marshmallow更適合處理復(fù)雜的對(duì)象結(jié)構(gòu)、字段驗(yàn)證和格式轉(zhuǎn)換,讓你在處理數(shù)據(jù)時(shí)更加得心應(yīng)手。

當(dāng)然,Marshmallow也不是完美無(wú)缺的,它的學(xué)習(xí)曲線可能相對(duì)json稍微陡峭一些,但一旦掌握,你會(huì)發(fā)現(xiàn)它在工作中無(wú)比強(qiáng)大,幾乎是一個(gè)Python開發(fā)者的“必備神器”!

到此這篇關(guān)于Python使用Marshmallow輕松實(shí)現(xiàn)序列化和反序列化的文章就介紹到這了,更多相關(guān)Python Marshmallow序列化和反序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 模擬生成動(dòng)態(tài)產(chǎn)生驗(yàn)證碼圖片的方法

    Python 模擬生成動(dòng)態(tài)產(chǎn)生驗(yàn)證碼圖片的方法

    這篇文章主要介紹了Python 模擬生成動(dòng)態(tài)產(chǎn)生驗(yàn)證碼圖片的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • python中bs4.BeautifulSoup的基本用法

    python中bs4.BeautifulSoup的基本用法

    這篇文章主要介紹了python中bs4.BeautifulSoup的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python多進(jìn)程提取處理大量文本的關(guān)鍵詞方法

    python多進(jìn)程提取處理大量文本的關(guān)鍵詞方法

    今天小編就為大家分享一篇python多進(jìn)程提取處理大量文本的關(guān)鍵詞方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 基于Python+OpenCV制作屏幕錄制工具

    基于Python+OpenCV制作屏幕錄制工具

    這篇文章主要介紹了如何利用Python?OpenCV實(shí)現(xiàn)屏幕錄制工具的制作,文中的示例代碼講解詳細(xì),對(duì)我們的學(xué)習(xí)和工作有一定的價(jià)值,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • python代碼實(shí)現(xiàn)小程序登錄流程時(shí)序總結(jié)

    python代碼實(shí)現(xiàn)小程序登錄流程時(shí)序總結(jié)

    這篇文章主要為大家介紹了python代碼實(shí)現(xiàn)小程序的登錄案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 盤點(diǎn)20個(gè)Python數(shù)據(jù)科學(xué)庫(kù)神器打造數(shù)據(jù)魔法世界

    盤點(diǎn)20個(gè)Python數(shù)據(jù)科學(xué)庫(kù)神器打造數(shù)據(jù)魔法世界

    數(shù)據(jù)科學(xué)家和分析師常常使用?Python?來(lái)處理數(shù)據(jù)、進(jìn)行分析和可視化,Python生態(tài)系統(tǒng)中有許多庫(kù),但有一些庫(kù)是數(shù)據(jù)科學(xué)家日常工作中必不可少的,本文將深入介紹20個(gè)重要的Python?庫(kù),包括示例代碼和用例
    2024-01-01
  • Python中HTTP請(qǐng)求的全面指南

    Python中HTTP請(qǐng)求的全面指南

    在現(xiàn)代網(wǎng)絡(luò)應(yīng)用中,HTTP(HyperText Transfer Protocol)協(xié)議是客戶端與服務(wù)器之間數(shù)據(jù)傳輸?shù)暮诵?本文都將從基礎(chǔ)到高級(jí),逐步引導(dǎo)你成為HTTP請(qǐng)求處理的高手,快跟隨小編一起學(xué)習(xí)起來(lái)吧
    2024-10-10
  • python檢索特定內(nèi)容的文本文件實(shí)例

    python檢索特定內(nèi)容的文本文件實(shí)例

    今天小編就為大家分享一篇python檢索特定內(nèi)容的文本文件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • python實(shí)現(xiàn)簡(jiǎn)單日期工具類

    python實(shí)現(xiàn)簡(jiǎn)單日期工具類

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單日期工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • python 字符串前加f的含義

    python 字符串前加f的含義

    Python 中字符串前面的?f?是?f-string?的標(biāo)識(shí)符,表示這是一個(gè)“格式化字符串字面值”(formatted string literal),從 Python 3.6 開始正式支持,這篇文章主要介紹了python 字符串前加f的含義,需要的朋友可以參考下
    2026-02-02

最新評(píng)論

平和县| 台中市| 屯留县| 寻乌县| 锡林郭勒盟| 葵青区| 尉犁县| 南郑县| 北京市| 柳河县| 鄂托克前旗| 衢州市| 友谊县| 枣阳市| 百色市| 科尔| 资阳市| 邻水| 古丈县| 吉水县| 宾阳县| 阿鲁科尔沁旗| 桐城市| 泰宁县| 庆元县| 东台市| 台中县| 定安县| 佳木斯市| 古交市| 濮阳县| 三穗县| 呼玛县| 高青县| 安顺市| 兴化市| 永泰县| 灵武市| 弋阳县| 云安县| 兴山县|