這肯定是個老生常談的問題,在此記錄下。
在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 serializableuser物件無法直接序列化,看下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引數定義如下:
因此,我們給user物件指定乙個序列化方法:default(obj)
is a function that should return a serializable versionof obj or raise typeerror. the default simply raises typeerror.
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只具備address和grade屬性,我們重新執行方法
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...