Python基礎(chǔ)教程: json序列化詳細(xì)用法介紹

前言

嗨嘍挽封,大家好呀~這里是愛看美女的茜茜吶

Python內(nèi)置的json模塊提供了非常完善的對象到JSON格式的轉(zhuǎn)換适篙。

廢話不多說,我們先看看如何把Python對象變成一個JSON:

d = dict(name='Kaven', age=17, sex='Male')
print(json.dumps(d))  # {"name": "Kaven", "age": 17, "sex": "Male"}

說明:

dumps()方法返回一個str,內(nèi)容就是標(biāo)準(zhǔn)的JSON。

類似的痊夭,dump()方法可以直接把JSON寫入一個 Object。

要把JSON反序列化為Python對象脏里,我們可以用loads()或者對應(yīng)的load()方法她我,前者把JSON的字符串反序列化,后者從Object中讀取字符串并反序列化:

比如這樣:

import json
json_str = '{"name": "Kaven", "age": 17, "sex": "Male"}'
print(json.loads(json_str)) # {'name': 'Kaven', 'age': 17, 'sex': 'Male'}

Python的dict對象可以直接序列化為JSON的{}迫横,那么如何用class對象番舆,比如定義Person類,然后序列化?

dumps 可選參數(shù)default就是把任意一個對象變成一個可序列為JSON的對象员淫,我們只需要為Person專門寫一個轉(zhuǎn)換函數(shù)合蔽,再把函數(shù)傳進(jìn)去即可:

import json

class Person(object):
    # __slots__ = ('name', 'age') # 通常class的實例都有一個__dict__屬性,它就是一個dict介返,
    # 用來存儲實例變量。也有少數(shù)例外沃斤,比如定義了__slots__的class,大家可以開啟后運行看看報錯信息
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


def PersonToDict(cls):
    return {
        'name': cls.name,
        'age': cls.age,
        'sex': cls.sex
    }


s = Person('Kaven', 17, 'Male')
print(json.dumps(s, default=PersonToDict))
# print(json.dumps(s, default=lambda obj: obj.__dict__)) 輸出和上面一樣
# 輸出 : {"name": "Kaven", "age": 17, "sex": "Male"}

這樣圣蝎,Person實例首先被PersonToDict()函數(shù)轉(zhuǎn)換成dict,然后再被序列化為JSON,大家看到下面有個lambda匿名函數(shù)衡瓶,他的用處可大了徘公,比如:

下次如果遇到一個Apple/Banaba等類的實例,可以把任意class的實例變?yōu)閐ict:

print(json.dumps(s, default=lambda obj: obj.__dict__)) # obj為對象參數(shù)名哮针,可自定義

同樣的道理关面,如果我們要把JSON反序列化為一個Person對象實例,loads()方法首先轉(zhuǎn)換出一個dict對象十厢,然后等太,我們再傳入的object_hook函數(shù)負(fù)責(zé)把dict轉(zhuǎn)換為Person實例:

import json

class Person(object):
    # __slots__ = ('name', 'age') # 通常class的實例都有一個__dict__屬性,它就是一個dict蛮放,
    # 用來存儲實例變量缩抡。也有少數(shù)例外,比如定義了__slots__的class,大家可以開啟后運行看看報錯信息
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


def DictToPerson(d):
    return Person(d['name'], d['age'], d['sex'])

json_str = '{"name": "Kaven", "age": 20, "sex": "Male"}'
cls = json.loads(json_str, object_hook=DictToPerson)
print(cls.name) # Kaven

Python還有個pickle模塊包颁,可能存在Python兼容問題瞻想,只能用Pickle保存那些不重要的數(shù)據(jù)压真。

尾語

感謝你觀看我的文章吶~本次航班到這里就結(jié)束啦 ??

希望本篇文章有對你帶來幫助 ??,有學(xué)習(xí)到一點知識~

躲起來的星星??也在努力發(fā)光蘑险,你也要努力加油(讓我們一起努力叭)滴肿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佃迄,隨后出現(xiàn)的幾起案子嘴高,更是在濱河造成了極大的恐慌,老刑警劉巖和屎,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴驮,死亡現(xiàn)場離奇詭異,居然都是意外死亡柴信,警方通過查閱死者的電腦和手機套啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來随常,“玉大人潜沦,你說我怎么就攤上這事⌒鞣眨” “怎么了唆鸡?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枣察。 經(jīng)常有香客問我争占,道長,這世上最難降的妖魔是什么序目? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任臂痕,我火速辦了婚禮,結(jié)果婚禮上猿涨,老公的妹妹穿的比我還像新娘握童。我一直安慰自己,他們只是感情好叛赚,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布澡绩。 她就那樣靜靜地躺著,像睡著了一般俺附。 火紅的嫁衣襯著肌膚如雪肥卡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天昙读,我揣著相機與錄音召调,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛唠叛,可吹牛的內(nèi)容都是我干的只嚣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼艺沼,長吁一口氣:“原來是場噩夢啊……” “哼册舞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起障般,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤调鲸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挽荡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藐石,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年定拟,在試婚紗的時候發(fā)現(xiàn)自己被綠了于微。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡青自,死狀恐怖株依,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情延窜,我是刑警寧澤恋腕,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站逆瑞,受9級特大地震影響荠藤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呆万,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一商源、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谋减,春花似錦、人聲如沸扫沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缎除。三九已至严就,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間器罐,已是汗流浹背梢为。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铸董。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓祟印,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粟害。 傳聞我的和親對象是個殘疾皇子蕴忆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問題請及時聯(lián)系我們以作處...
    孤城暮雨丶閱讀 165評論 0 0
  • Python序列化和反序列化 通過將對象序列化可以將其存儲在變量或者文件中悲幅,可以保存當(dāng)時對象的狀態(tài)套鹅,實現(xiàn)其生命周期...
    sunhaiyu閱讀 1,137評論 0 1
  • 該文章寫得不錯,順手轉(zhuǎn)載汰具。轉(zhuǎn)載自:Python序列化和反序列化 通過將對象序列化可以將其存儲在變量或者文件中卓鹿,可以...
    lucasdada閱讀 125評論 0 0
  • 1.單元測試 ①是什么复局? 對一個模塊氯葬、一個函數(shù)或者一個類進(jìn)行正確性檢驗的測試工作。 ②最好的好處苏潜? 確保一個程序模...
    姚屹晨閱讀 2,885評論 0 0
  • 序列化:把變量從內(nèi)存中變成可存儲或傳輸?shù)倪^程存谎。 Python中內(nèi)置了pickle模塊來實現(xiàn)序列化拔疚。 pickle模...
    納米君閱讀 2,385評論 0 2