使用 json.dumps()
將個體轉換成 JSON 文件時,Python json 模組可以自行處理絕大部份的 Python 內建型別資料,列表請見 Performs the following translations in decoding by default.。但是當轉換的個體為自定型別,或者是容器中包含自定型別資料時,你就必須指定 default 或 cls 鍵值參數,指示 json.dumps() 如何轉換那些自定型別資料。
default keyword argument
以 default 鍵值參數指定自定型別資料的序列化函數或方法。該函數或方法必須接受一個參數。
當你指定 default 鍵值參數時,json.dumps() 仍將使用預設的 json.JSONEncoder 擷取與轉換資料內容。但是當資料內容的型別是 json.JSONEncoder 所不支援的自定型別時,它就會將這個資料丟給 default 指定的方法處理。
cls keyword argument
另一種處理自定型別轉換動作的方式是使用 cls 鍵值參數。cls 鍵值參數必須指定一個以 json.JSONEncoder 為基礎類別的子類別,而且至少應覆寫 default 方法。
當你指定 cls 鍵值參數,json.dumps() 將直接使用你指定的類別處理資料轉換動作。
大多數情形,我們只需要指定鍵值參數 default 為我們自定的序列化方法即可。當你想要改變 Python json 模組的預設序列化行為時,你才需要使用鍵值參數 cls 自定 JSONEncoder 子類別的方式。
來源個體的處理策略
容器
容器係指 Python 內建型別中的 list, tuple, dict 。json.dumps() 有能力一一取出容器中的元素,並進一步轉換元素的內容。但若容器中具有自定型別的元素,則你至少要以 default 指定自定的序列化方法,否則它將擲出 TypeError 。
自定型別個體
當你直接將一個自定型別個體交給 json.dumps() 時,你必須指定 default 或 cls 鍵值參數。因為 json.dumps() 預設使用的 json.JSONEncoder 類別不會處理自定型別,若你並未指定任何序列化方法或編碼類別時,它將直接擲出 TypeError 。
下列範例利用 Python 的名稱空間能力,將自定型別與搭配的 JSONEncoder 編碼類別放在一起(sample2.py)。而使用者放在另一個源碼文件(sample3.py)。
由於 d 本身的資料型態就是 json.JSONEncoder 不認得的,所以它會直接把 d 傳給 C.json_serializer() 。附帶一提,在此你必須寫成 default=C.json_serializer
,不能寫 default=d.json_serializer
。
樂多舊網址: http://blog.roodo.com/rocksaying/archives/12153263.html
樂多舊回應