python json解析方法_Python 中的 JSON 方式讲解
Python的dict對象可以直接序列化為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('Bob',?26,?100)
print(json.dumps(s))
運行代碼,報TypeError錯,如下:Traceback?(most?recent?call?last):
...
TypeError:?<__main__.student>?is?not?JSON?serializable
錯誤的原因是Student對象不是一個可序列化為JSON的對象,dumps()方法提供了很多可選參數。
參考地址為https://docs.python.org/2/library/json.html#json.dumps這些可選參數就是讓我們來定制JSON序列化使用的。
可選參數default就是把任意一個對象變成一個可序列為JSON的對象,我們只需要為Student專門寫一個轉換函數,再把函數傳進去即可:def?student2dict(std):
return?{
'name':?std.name,
'age':?std.age,
'score':?std.score
}
print(json.dumps(s,?default=student2dict))
如果遇到另外一個對象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?=?'{"age":?20,?"score":?88,?"name":?"Bob"}'
print(json.loads(json_str,?object_hook=dict2student))
運行結果如下:<__main__.student>
打印出的是反序列化的Student實例對象。
總結
以上是生活随笔為你收集整理的python json解析方法_Python 中的 JSON 方式讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx匹配规则_Nginx系列之se
- 下一篇: websocket python爬虫_p