簡單介紹Python中的JSON使用

2022-10-04 23:03:27 字數 1812 閱讀 2068

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 可以...