<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
序列化是將物件轉換為可以在以後儲存和檢索媒介中的過程。比如,將物件的當前狀態儲存到檔案中。對於一些複雜的專案,序列化是所有開發人員遲早要做的事情。
Python 語言的優點之一是它在許多常見的程式設計任務中易於使用,往往只需幾行程式碼,就可以實現讀取檔案 IO、繪製圖表等功能,序列化在 Python 中實現起來也非常容易。
在本文中,我將給大家帶來將類物件序列化為 JSON 物件的一些技巧。
為了講述序列化的技巧,我們首先來定義一個類作為範例,
程式碼如下:
class LabelSimple: def __init__(self, label, x, y, width, height): self.label = label self.x = x self.y = y self.width = width self.height = height
如果我們想要將其序列化(比如直接列印類的物件),我們將會得到如下錯誤資訊:
label = LabelSimple("person", 10, 10, 4, 10) print(label) >> __main__.LabelSimple object at 0x000002C3913EB2E0>
Python
中的JSON 庫提供了一個方便的方法,稱為 json.dumps()
。它可以將任何 Python 物件轉換為 JSON。這聽起來很簡單,我們不妨來直接呼叫試試看。
import json print(json.dumps(label)) >>... /usr/lib/python3.7/json/encoder.py in default(self, o) 177 178 """ --> 179 raise TypeError(f'Object of type {o.__class__.__name__} ' 180 f'is not JSON serializable') 181 TypeError: Object of type LabelSimple is not JSON serializable
json.dumps()
為我們自定義物件呼叫相應的編碼器,並且由於我們沒有實現編碼器而引發類物件錯誤。
為了將上述類物件可以直接序列化後輸出,我們能想到的最簡單的方式就是使用內建的 __dict__ 方法來顯示物件的內容.
程式碼如下:
label = Label("person", 10, 10, 4, 10) print(label.__dict__) print(json.dumps(label.__dict__))
輸出如下:
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
可以看出使用上述方法後, print() 函數和 json.dumps() 函數可以將類物件內容以JSON格式進行輸出。
上述實現雖然可以實現序列化的目的,但是我們每次都需要呼叫 __dict__方法,多少有點麻煩。我們還可以有更簡單的方法,那就是實現類的內建函數__str
和__repr__
,
程式碼如下:
class Label: def __init__(self, label, x, y, width, height): self.label = label self.x = x self.y = y self.width = width self.height = height def __iter__(self): yield from { "label": self.label, "x": self.x, "y": self.y, "width": self.width, "height": self.height }.items() def __str__(self): return json.dumps(dict(self), ensure_ascii=False) def __repr__(self): return self.__str__()
呼叫程式碼如下:
label = Label("person", 10, 10, 4, 10) print(label) # print(json.dumps(label))
上述程式碼,print可以輸出序列化後的JSON內容,但是json.dumps依舊不能正常工作,這是因為我們並沒有實現encoder。
為了支援 json.dumps 用例,常用的方法是通過繼承 JSONEncoder 來實現自定義編碼器類。在上述例子中,由於我們希望物件是 JSON 字典格式,所以我們只是返回字典。
程式碼如下:
from json import JSONEncoder class MyEncoder(JSONEncoder): def default(self, obj): return obj.__dict__ label = Label("person", 10, 10, 4, 10) print(MyEncoder().encode(label)) print(json.dumps(label, cls=MyEncoder)) print(label)
輸出如下:
# outputs of a Label class object
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
本文重點介紹了在Python中,如何來將自定義物件序列化為JSON以JOSN格式進行輸出,由淺入深給出了不同的解決方案,並給出了相應的原始碼。
到此這篇關於在Python 中將類物件序列化為JSON的文章就介紹到這了,更多相關Python 將類物件序列化JSON內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45