博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 对象可 json 序列化和字典投影
阅读量:6583 次
发布时间:2019-06-24

本文共 1656 字,大约阅读时间需要 5 分钟。

hot3.png

这两个函数联合起来用在接口返回 json 数据上非常好使。

lang:pythonimport datetimefrom copy import deepcopydef model2dict(model, datetime_format='%Y-%m-%d %H:%M:%S'):    """    本函数用于使对象可 json 序列化,且返回的字典都是新的(deepcopy)    """    if isinstance(model, dict):        model = Storage(deepcopy(model))        to_pop = []        for k in model:            # 过滤            if isinstance(k, basestring) and (k.startswith('_') or k.isupper()):                to_pop.append(k)                continue            # 转换            elif isinstance(model[k], datetime.datetime):                model[k] = model[k].strftime(datetime_format)            # 递归            else:                model[k] = model2dict(model[k], datetime_format)        for k in to_pop:            model.pop(k)        return model    elif hasattr(model, '__dict__'):        return model2dict(model.__dict__, datetime_format)    elif isinstance(model, (list, tuple)):        return [model2dict(m, datetime_format) for m in model]    else:        return modeldef dict_project(data, map_rulls={}):    """    字典投影,支持取 data 的子集和改名。只想投影而不想改名的,写个 1 就行,eg:        >>> data        {'a': 1,         'b': 2,         'c': 3}        >>> map_rulls        {'a': 'x',         'c': 1}        >>> dict_project(data, map_rulls)        {'x': 1,         'c': 3}    """    if isinstance(data, dict):        data = Storage({map_rulls[k] if isinstance(map_rulls[k], basestring) else k: data[k] for k in data if k in map_rulls})    elif isinstance(data, (list, tuple)):        return [dict_project(o) for o in data]    else:        raise ValueError('无法处理对象: %s' % str(data))    return data

Storage 参见上一篇

转载于:https://my.oschina.net/lionets/blog/380934

你可能感兴趣的文章
2、递归遍历文件夹下每一个文件
查看>>
Remove auto_increment from Schema Dumps (mysqld...
查看>>
解决activity加上Theme.Translucent.NoTitleBar 页面跳转显示桌面
查看>>
php类库
查看>>
浅谈Java中的对象和引用
查看>>
SQL 注入自我总结
查看>>
Linux线程
查看>>
Exchange Server 2013 系列八:邮箱服务器角色DAG实战
查看>>
一个有趣的命令
查看>>
我的友情链接
查看>>
已发布13集网站开发技术视频:http://blog.sina.com.cn/s/blog_67d27f340102vf7l.html
查看>>
Mysql ibdata 丢失或损坏如何通过frm&ibd 恢复数据
查看>>
MySQL数据库的优化(二)
查看>>
Deepin OS和WIN7双启动 花屏原因一例
查看>>
UIMenuController—为UITextField禁用UIMenuController功能
查看>>
Protobuf使用不当导致的程序内存上涨问题
查看>>
【原创】扯淡的Centos systemd与Docker冲突问题
查看>>
Spring+Mybatis多数据库的配置
查看>>
给大家推荐一个免费下载名称读写ntfs软件的地方
查看>>
在MySQL数据库建立多对多的数据表关系
查看>>