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物件
- python 序列化pickle&json模組PythonJSON
- Json序列化在golang中的應用JSONGolang
- Python常用標準庫(pickle序列化和JSON序列化)PythonJSON
- Python學習——序列化與反序列化-json&picklePythonJSON
- Python之資料序列化(json、pickle、shelve)PythonJSON
- JSON繼承JsonConverter序列化與反序列化重寫類屬性JSON繼承
- 類轉詞典 轉json 序列化 魔術方法JSON
- JSON-B:簡化 JSON 序列化和反序列化JSON
- JSON在Python中的使用JSONPython
- 詳解電子表格中的json資料:序列化與反序列化JSON
- Kotlin Json 序列化KotlinJSON
- 【JSON】Python與Flask中涉及到的JSONJSONPythonFlask
- C#中實現JSON功能及物件的序列化和反序列化C#JSON物件
- Java物件的序列化與反序列化-Json篇Java物件JSON
- Jaskson精講第7篇-類繼承關係下的JSON序列化與反序列化JsonTypeInfo繼承JSON
- Newtonsoft.Json序列化JSON字串問題JSON字串
- Python中物件序列化和反序列化Python物件
- C#序列化和反序列化(json)C#JSON
- Go 中時間型別欄位的 JSON 序列化和反序列化的處理技巧Go型別JSON
- C#中JSON轉換類C#JSON
- Python中字典和json的區別!PythonJSON
- JavaScript物件序列化為JSONJavaScript物件JSON
- C# Json反序列化C#JSON
- 把JSON資料格式轉換為Python的類物件JSONPython物件
- 如何保持json序列化的順序性?JSON
- python類中的方法Python
- Newtonsoft.Json/Json.NET忽略序列化時的意外錯誤JSON
- Python中解析json資料PythonJSON
- Python常用模組(random隨機模組&json序列化模組)Pythonrandom隨機JSON
- JSON序列化之旅:深入理解.NET中的JsonResult與自定義ContractResolverJSON
- 序列化和反序列化pickle和json 模組JSON
- 類轉json的基類實現JSON
- flutter json_annotation和json_serializable處理json資料序列化FlutterJSON