zoukankan      html  css  js  c++  java
  • 【服务后端】Python序列化对象为Json方法

    方法非常简单,用isinstance函数识别出变量类型,递归调用函数分解到原子类型的变量,序列化。

    缺点是递归调用会有函数栈,复杂的对象可能占用较大内存


    """
            继承自simplejson的编码基类,用于处理复杂类型的编码
    """
    def JsonCode(obj):
        def _any(obj):  
            ret = None

            #debug('temp',type(obj),obj)
            #查询结果集处理
            if isinstance(obj,QuerySet):           
                ret = _list(obj)       
            #单个结果处理
            elif isinstance(obj,models.Model):
                ret = _model(obj)
            #list处理
            elif isinstance(obj,list):
                ret = _list(obj)
            #字典处理,字典还是需要处理
            elif isinstance(obj,dict):
                #ret = obj#_dict(obj)
                ret = _dict(obj)
               
            #日期时间类型转换
            elif isinstance(obj,datetime.datetime):
                ret = obj.strftime('%Y-%m-%d %H:%M:%S')
           
            #日期类型转换
            elif isinstance(obj,datetime.date):
                ret = obj.strftime('%Y-%m-%d')
               
            #字符串或者unicode编码的直接返回
            elif isinstance(obj, str) or isinstance(obj, unicode):
                ret = obj
            else:
                ret = str(obj)
            return ret
        #model
        def _model(obj):
            ret = {}
            for item in obj._meta.fields:
                #id不要返回,外键怎么处理?
                #if item.attname == 'id':
                #    continue
                ret[item.attname] = _any(getattr(obj, item.attname))
            return ret
       
        def _list(obj):
            ret = []
            for item in obj:
                ret.append(_any(item))
            return ret
       
        def _dict(obj):
            #20160429  修改ret=[]  为 ret={},因为需要返回的数据是字典
            ret = {}
            # _dict  {'Name': 'Zara', 'Age': 7}
            #Items()  -> [('Age', 7), ('Name', 'Zara')]
            for k,v in obj.items():
                #print k,v
                ret[k] = _any(v)
            return ret
       
        #调用_any主入口,返回字典
        return _any(obj)

    好记性不如烂笔头
  • 相关阅读:
    ACM集训的第一题
    python作用域
    python——异常类型
    PycharmV2017 1.x使用说明
    python之路——面向对象(进阶篇)
    python之路——面向对象(基础篇)
    python学习之路——基础篇(3)模块(续)
    python之路——基础篇(2)模块
    Python学习之路——基础篇(1)字符串格式化
    初学设计模式:策略模式
  • 原文地址:https://www.cnblogs.com/inns/p/5507012.html
Copyright © 2011-2022 走看看