首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python JSON 進階:自訂類別序列化與反序列化完整攻略

     編輯:更多程式設計知識

Python json 模組預設僅支援內建型別。若需序列化自訂類別實例,需透過 default 與 object_hook 參數自訂轉換邏輯。本文以 Student 類別為例詳細說明。

問題:TypeError: not JSON serializable


import json

class Student(object):
    def __init__(self, name, age, score):
        self.name, self.age, self.score = name, age, score

s = Student('Bob', 20, 88)
json.dumps(s)  # TypeError

解決方案:default 參數

default 接受一個函式,將不可序列化物件轉為可序列化型別(通常是 dict)。

寫法 1:專用轉換函式


def student2dict(std):
    return {'name': std.name, 'age': std.age, 'score': std.score}

json.dumps(s, default=student2dict)
# '{"age": 20, "score": 88, "name": "Bob"}'

寫法 2:通用 __dict__ 偷懶法


json.dumps(s, default=lambda obj: obj.__dict__)

多數類別實例擁有 __dict__ 屬性儲存實例變數;定義 __slots__ 的類別除外。

反序列化:object_hook 參數

object_hook 接受一個函式,將解析出的 dict 轉為目標物件。


def dict2student(d):
    return Student(d['name'], d['age'], d['score'])

json_str = '{"age": 20, "score": 88, "name": "Bob"}'
stu = json.loads(json_str, object_hook=dict2student)
print(stu)  # <__main__.Student object at 0x...>

介面設計啟示

json.dumps/loads 只需一個必填參數即可滿足 90% 需求;進階需求時再透過關鍵字參數擴充,兼顧「簡單易用」與「高度可擴充」,是 API 設計的經典範例。

小結

  • 序列化自訂類別:default=lambda obj: obj.__dict__ 或專用函式。
  • 反序列化為自訂類別:object_hook=dict2student。
  • 若需跨語言、Web 標準,請優先使用 JSON;Python 專用可用 pickle。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved