Python中類的JSON序列化

2021-08-14 13:39:46 字數 3057 閱讀 3360

這肯定是個老生常談的問題,在此記錄下。

在python中,當在我們使用sqlalchemy.orm來對資料庫物件進行訪問,並將這些資料展現到前台頁面時,我們就面臨如何將python中的類物件進行json序列化。

簡單起見,我們從**說起:

首先,我們定義乙個使用者類,用以儲存使用者資訊

class

user

(object):

def__init__

(self, id, name, password):

self.__id = id

self.__name = name

self.__password = password

def__repr__

(self):

return

"id is %s, name is %s, password is %s" % (self.__id, self.__name, self.__password)

defget_name

(self):

return self.__name

defget_password

(self):

return self.__password

defget_id

(self):

return self.__id

例項化乙個使用者物件user1,並直接進行json序列化dumps操作

user1 = user(1, 'test', 'password')

print(user1)

# 直接序列化

print(json.dumps(user1))

得到報錯資訊:

typeerror: object of type 『user』 is not json serializable

user物件無法直接序列化,看下dumps方法的定義:

def

dumps

(obj, *, skipkeys=false, ensure_ascii=true, check_circular=true,

allow_nan=true, cls=none, indent=none, separators=none,

default=none, sort_keys=false, **kw):

注意,default引數定義如下:

default(obj)is a function that should return a serializable version

of obj or raise typeerror. the default simply raises typeerror.

因此,我們給user物件指定乙個序列化方法:

def

user_to_str

(user):

return

重新執行dumps方法,我們得到如下結果:

當然,在python中_dict_是乙個特殊的屬性,其包含了類的所有屬性,因此,我們還可以給user物件指定如下引數

json.dumps(user1, default=lambda obj: obj.dict)

重新執行,我們得到如下結果:

假設我們重新定義乙個teacher類,如下:

class

teacher

(object):

__slots__ = ('address', 'grade')

def__repr__

(self):

address = none

grade = none

if hasattr(self, 'address'):

address = self.address

if hasattr(self, 'grade'):

grade = self.grade

return

"address is %s, grade is %s" % (address, grade)

注意,與user類略有不同的是,我們通過_slots_內建屬性限制了物件teacher只具備addressgrade屬性,我們重新執行方法

json.dumps(teacher, default=lambda obj: obj.dict)

得到報錯資訊:

attributeerror: 『teacher』 object has no attribute 『dict

使用_slots_限制的類不具備_dict_屬性,因此,我們還需要自定實現teacher類的json序列化方法

def

teacher_to_str

(teacher):

address = ''

grade = ''

if hasattr(teacher, 'address'):

address = teacher.address

if hasattr(teacher, 'grade'):

grade = teacher.grade

return

Python 之 Json序列化巢狀類方式

想要用python自已手動序列化巢狀類,就要明白兩個問題 1.json是什麼?2.json支援什麼型別?答案顯而易見 json就是巢狀物件 json在python中支援列表,字典 當然也支援int,string.不過說這個也沒多大必要 很好,等等,列表,字典?我們在python中學過列表,字典,字典...

Python 自定義類物件序列化為Json串

之前已經實現了python json串反序列化為自定義類物件,這次來實現了json的序列化。測試 和結果如下 import json.jsontool class score math 0 chinese 0 class book name type class student id name sc...

7 Python中的序列化模組json

json模組 用於json字串和字典型別間進行轉換 json.dumps 將字典型別的資料轉成json字串 json.loads 將json字串轉成字典物件 json.dump 將字典型別的資料轉成字串,並寫入到json檔案中 json.load 從json檔案中讀取資料,並轉成字典物件 impor...