json高階
python的dict物件可以直接序列化為json的{},不過,很多時候,我們更喜歡用class表示物件,比如定義student類,然後序列化:
import json
class student(object):
def __init__(self, name, age, score):
self.name = name
self.age = ag程式設計客棧e
self.score = score
s = student('bob', 20, 88)
print(json.dumps(s))
執行**,毫不留情地得到乙個typeerror:
traceback (most recent call last):
...typeerror: <__main__.student object at> is not json serializable
錯誤的原因是student物件不是乙個可序列化為json的物件。
如果連class的例項物件都無法序列化為json,這肯定不合理!
別急,我們仔細看看dumps()方法的引數列表,可以發現,除了第乙個必須的obj引數外,dumps()方法還提供了一大堆的可選引數:
這些可選引數就是讓我們來定製json序列化。前面的**之所以無法把student類例項序列化為json,是因為預設情況下,dumps()方法不知道如何將student例項變為乙個json的{}物件。
可選引數defaul程式設計客棧t就是把任意乙個物件變成乙個可序列為json的物件,我們只需要為student專門寫乙個轉換函式,再把函式傳進去即可:
def student2dict(std):
return
print(json.dumps(s, default=student2dict))
這樣,student例項首先被student2dict()函式轉換成dict,然後再被順利序列化為json。
不過,下次如果遇到乙個teacher類的例項,照樣無法序列化為json。我們可以偷個懶,把任意class的例項變為dict:
print(json.dumps(s, default=lambda obj: obj.__dict__))
因為通常class的例項都有乙個__dict__屬性,它就是乙個dict,用來程式設計客棧儲存例項變數。也有少數例外,比如定義了__slots__的class。
同樣的道理,如果我們要把json反序列化為乙個student物件例項,loads()方法首先轉換出乙個dict物件,然後,我們傳入的object_hook函式負責把dict轉換為student例項:
def dict2student(d):
return student(d['name'], d['age'], d['score'])
json_str = ''
print(json.loads(jso程式設計客棧n_str, object_hook=dict2student))
執行結果如下:
<__main__.student object at>
列印出的是反序列化的stude程式設計客棧nt例項物件。
小結python語言特定的序列化模組是pickle,但如果要把序列化搞得更通用、更符合web標準,就可以使用json模組。
json模組的dumps()和loads()函式是定義得非常好的介面的典範。當我們使用時,只需要傳入乙個必須的引數。但是,當預設的序列化或反序列機制不滿足我們的要求時,我們又可以傳入更多的引數來定製序列化或反序列化的規則,既做到了介面簡單易用,又做到了充分的擴充套件性和靈活性。
本文標題: 簡單介紹python中的json使用
本文位址:
Python筆記9 Python中的json
不了解json的可以先取看看json python中有自帶的json編碼器和解碼器 dumps loads dump load 以上四種方法是python中json的主要處理方法 定義兩個序列 l1 1,2,3,123 l2 dumps轉換 newl1 json.dumps l1 newl2 jso...
Python中class的簡單介紹
類的定義 python class簡單操作 為了學習python中class,我們編寫乙個簡單的程式。我們的任務是找到stduents.txt檔案中,gpa最高的那名同學,並列印出他的資訊 其中students.txt檔案中的內容如下 zhangsan 127 228 lisi 100 400 wa...
Python中的lambda的簡單介紹
在學習python的過程中,lambda的語法經常出現,現在將它整理一下,以備日後檢視。舉個例子如下 1 func lambda x x 1 2print func 1 3 24print func 2 5 367 以上lambda等同於以下函式 8def func x 9return x 1 可以...