Python中類的JSON序列化
這肯定是個老生常談的問題,在此記錄下。
在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)
def get_name(self):
return self.__name
def get_password(self):
return self.__password
def get_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 {'id': user.get_id(), 'name': user.get_name(), 'password': user.get_password()}
重新執行dumps方法,我們得到如下結果:
{“id”: 1, “name”: “test”, “password”: “password”}
當然,在Python中_dict_是一個特殊的屬性,其包含了類的所有屬性,因此,我們還可以給User物件指定如下引數
json.dumps(user1, default=lambda obj: obj.dict)
重新執行,我們得到如下結果:
{“_User__id”: 1, “_User__name”: “test”, “_User__password”: “password”}
假設我們重新定義一個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 {'address': address, 'grade': grade}
相關文章
- Python實現JSON反序列化類物件PythonJSON物件
- Python中巢狀自定義型別的JSON序列化與反序列化Python巢狀型別JSON
- Swift 中的 JSON 反序列化SwiftJSON
- python 學習 -- json的序列化和反序列化PythonJSON
- Flutter中JSON序列化與反序列化FlutterJSON
- Json反序列化物件通用工具類JSON物件
- Json序列化在golang中的應用JSONGolang
- python 序列化pickle&json模組PythonJSON
- Android 中的Json解析工具fastjson 、序列化、反序列化AndroidJSONAST
- 在C#中實現Json的序列化與反序列化C#JSON
- Json序列化之.NET開源類庫Newtonsoft.Json的研究JSON
- Python常用標準庫(pickle序列化和JSON序列化)PythonJSON
- Python學習——序列化與反序列化-json&picklePythonJSON
- Python序列化模型資料為JSONPython模型JSON
- 詳解電子表格中的json資料:序列化與反序列化JSON
- JSON 物件序列化、反序列化JSON物件
- JSON繼承JsonConverter序列化與反序列化重寫類屬性JSON繼承
- [.net 物件導向程式設計進階] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json類物件程式設計JSON
- C#中實現JSON功能及物件的序列化和反序列化C#JSON物件
- Python之資料序列化(json、pickle、shelve)PythonJSON
- Python中物件序列化和反序列化Python物件
- Json串與List、Bean之間的轉換,處理類中List屬性的序列化問題JSONBean
- 【Python】淺談python中的jsonPythonJSON
- Java物件的序列化與反序列化-Json篇Java物件JSON
- Python 中的類(中)Python
- JSON在Python中的使用JSONPython
- Python序列化模組pickle和json使用和區別PythonJSON
- Python常用模組(random隨機模組&json序列化模組)Pythonrandom隨機JSON
- C#序列化和反序列化(json)C#JSON
- C# 序列化與反序列化jsonC#JSON
- Kotlin Json 序列化KotlinJSON
- 【JSON】Python與Flask中涉及到的JSONJSONPythonFlask
- Jaskson精講第7篇-類繼承關係下的JSON序列化與反序列化JsonTypeInfo繼承JSON
- C#中JSON轉換類C#JSON
- C# Json 序列化與反序列化一C#JSON
- C# Json 序列化與反序列化二C#JSON
- JavaScript物件序列化為JSONJavaScript物件JSON
- C# Json反序列化C#JSON