python对象转字典
1、为什么要对python对象转换为字典
python
字典与json
对象结构相似,json
数据结构是最常用的数据结构
2、python对象转字典及序列化的核心点在哪
python
对象有很多内置属性并不是我们所需要的python
字典对象在序列化的时候,时间字段序列化会报错- 自定义类型数据的序列化
3、实战示例
import logging
import traceback
from datetime import datetime, datefrom user.models import GenderEnumdef to_json(obj):fields = {}if isinstance(obj, dict):attributes = obj.keys()else:attributes = [x for x in obj.__dict__ if not x.startswith('_')]for field in attributes:if isinstance(obj, dict):data = obj.get(field)else:data = obj.__getattribute__(field)try:if isinstance(data, datetime):data = data.strftime('%Y-%m-%d %H:%M:%S')if isinstance(data, date):data = data.strftime('%Y-%m-%d')if isinstance(data, GenderEnum):data = data.valuefields[field] = dataexcept TypeError:fields[field] = Nonelogging.error(traceback.format_exc())return fields
3.1、注意事项
3.1.1、python
对象的内置属性都是以_
开头的,所以可以通过判断数据开头是不是_
来过滤内置属性
attributes = [x for x in obj.__dict__ if not x.startswith('_')]
3.1.2、python
字典对象没有__dict__
属性,所以要对对象类型做判断
if isinstance(obj, dict):attributes = obj.keys()
else:attributes = [x for x in obj.__dict__ if not x.startswith('_')]
3.1.3、python
字典对象与非字典对象取值方式不一样,非字典对象使用obj.__getattribute__(field)
,字典对象使用data = obj.get(field)
方式取值
if isinstance(obj, dict):data = obj.get(field)
else:data = obj.__getattribute__(field)
3.1.4、时间、日期类型对象值的获取
if isinstance(data, datetime):data = data.strftime('%Y-%m-%d %H:%M:%S')
if isinstance(data, date):data = data.strftime('%Y-%m-%d')
3.1.5、自定义对象值的获取
if isinstance(data, GenderEnum):data = data.value
自定义类型GenderEnum
class GenderEnum(enum.Enum):man = 1woman = 2