Python JSON序列化與反序列化

2021-07-16 21:36:37 字數 2976 閱讀 3979

python

廖雪峰python教程學習筆記

在程式的執行過程中,所有的變數都是在記憶體中,變數在記憶體中來得快也去得快,所以我們需要將記憶體中的變數轉化為可儲存的物件或者可傳輸的物件,這樣的過程就叫做序列化

python中提供了pickle模組來實現物件的序列化與反序列化,pickle.dumps()將任意的物件序列化成乙個bytes。pickle.loads()實現反序列化,得到物件。

json:

json可以理解為序列化的標準格式。json和python內建的資料型別對應如下:

json型別

python型別

{}dict

list

「string」

str1234.56

int/float

true/false

true/false

null

none

python內建的json模組提供了完備的python物件到json格式的轉換。將python物件變為乙個json:

"""

利用json模組序列化與反序列化

"""import json

di = dict(name='bob', age=20, score=93)

>>> json.dumps(di)

''

同理,將json反序列化為python物件:

json_str = ''

>>> json.loads(json_str)

class物件中使用json:

通常情況下,我們都習慣使用class表示物件,若我們需要將student類進行序列化 ,我們可以做如下嘗試:

import json

class

student

(object):

def__init__

(self, name, age, score):

self.name = name

self.age = age

self.score = score

s = student('weiyu', 23, 98)

print(json.dumps(s))

看似很合理,但是會得到乙個錯誤:

traceback(most recent call last):

...typeerror: <__main__.student object at 0x0000023a4c643128> is

not json serializable

原因是student這個物件並不能序列化為json。

但是dumps()方法的引數列表中還有很多可選引數,這些款引數就是提供給我們來定製json序列化的。

其中default引數就是把任意乙個物件程式設計乙個可序列的json的物件,但是在這之前需要為student寫乙個轉換函式,然後再將函式傳進去:

import json

class

student

(object):

def__init__

(self, name, age, score):

self.name = name

self.age = age

self.score = score

# 編寫乙個轉換函式如下:

defstudent2dict

(std):

return

s = student('weiyu', 23, 98)

print(json.dumps(s, default=student2dict)) # 將轉換函式傳入引數default

>>>

# 輸出結果

這樣student例項先被student2dict轉換成dict,然後被序列化為json,但是如果下一次遇到另外乙個例項teacher,又需要編寫乙個轉換函式,這樣可能就太麻煩了。

我們可以利用__dict__屬性,將任意class例項變為dict:

>>>print(json.dumps(s, default=lambda obj: obj.__dict__))

>>>

得到同樣的結果,因為通常的class的例項都有乙個–dict–(前後是兩個下滑線)屬性,它自身就是乙個dict,用來儲存例項變數。

同理,需要反序列化json時,loads()方法先轉換出乙個dict物件,然後通過傳入的object_hook函式將dict轉換為student例項,檢視loads()引數列表。定義轉換函式:

def

dict2student

(d):

return student(d['name'], d['age'], d['score'])

# 測試輸出

>>> json_str = ''

>>> print(json.loads(json_str, object_hook=dict2student))

<__main__.student object at 0x000001f7fde1e940>

這樣就實現了json序列化與反序列化。另,強推廖雪峰老師的python教程。

Python Json序列化與反序列化

在python中,序列化可以理解為將python物件編碼轉化為json格式的字串 反序列化可以理解為把json格式的字串解碼為python物件 python的dumps方法和loads方法,可實現資料的序列化和反序列化。具體來說,dumps方法,可將json格式資料序列為python的相關的資料型別...

Python json和pickle序列化

1.序列化 把記憶體的一些資料物件存到硬碟。資料物件是一些基本資料型別,如list dict,set等。2.反序列化 將硬碟的內容載入成原來的資料物件。3.為什麼要用序列化與反序列化 當你想把乙個資料暫時儲存起來而過會又要用的時候,就可以把它先儲存到硬碟,保證安全性。需要時在取出來。4.json序列...

序列化與發序列化

1.序列化與反序列化都用的是相同的 binaryformatter bf new binaryformatter 2.使用 流 的方式 filestream fs new filestream 序列化內容路徑 一般為本地bin debug檔案中 類名.bin filemode.openorcreat...