python对象转字典

1、为什么要对python对象转换为字典

python字典与json对象结构相似,json数据结构是最常用的数据结构

2、python对象转字典及序列化的核心点在哪

  • python对象有很多内置属性并不是我们所需要的
  • python字典对象在序列化的时候,时间字段序列化会报错
  • 自定义类型数据的序列化

3、实战示例

import logging
import traceback
from datetime import datetime, date

from user.models import GenderEnum


def 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.value
            fields[field] = data
        except TypeError:
            fields[field] = None
            logging.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 = 1
    woman = 2
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐