关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » Python »Python实现支持JSON存储和解析的对象

    Python实现支持JSON存储和解析的对象

    2014-12-03 00:00:00 出处:吕大豹的博客
    分享

    微信扫一扫:分享

    Scan me!

    微信里点“发现”,扫一下

    二维码便可将本文分享至朋友圈。

    我们知道利用JSON模块可方便的将Python基本类型(dict、list等)数据永久的存储成文件,同时也可以通过自定义转换函数和继承JSON encode&decode的方法实现自定义类的存储。本文就在前文“ Python JSON模块”的基础上,实现python支持JSON存储的对象。

    对象能够采取JSON存储和解析是有很大意义的。例如机器学习中所有分类算法的训练过程中都存在大量的数据计算,假如每次启动分类都需要重新训练分类算法浪费资源且没有效率,假如能够将训练产生的分类算法对象保存起来,那么除非需要算法调优,以后只需载入即可。另一方面,对象能够进行JSON解析和存储也使得其可以在网络上传送,这在当下云计算、分布式数据处理中都有非凡的意义。

    为了实现自存储和解析,定义对象的关键操作有:

    0,将object_json.py copy至包中,定义对象的模块导入object_json:import object_json。

    1,__init__()函数要支持可变数量的函数调用,即要写成__init__(self, …, , **args)。如此定义对象才可以有除构造阶段需要初始化的属性之外的属性。

    2,对于对象构造阶段必须初始化的属性,__init__()函数中的形参必须与这些属性名称完全相同,如此才能通过字典‘key’: value对构造对象。

    3,定义一个属性‘__name__’–该对象实例的名称,利用inspect模块实现。‘__name__‘属性主要用于产生对象存储时默认的文件名称。

    4,定义jsonDumps()和jsonLoadTransfer()方法,通过objectLoadFromFile()完成对象JSON文件load和新对象创建。

    (i)jsonDumps()用于将对象转换成dict并通过json.dumps()将对象存储成json文件,若用户不指定文件名则以instancename.json为默认存储文件。由于JSON只支持python基本类型,因此若对象中有一些其他类型(如numpy matrix),则需将其转化成Python基本类型(如matrix.tolist()将matrix转换成list)。

    (ii)jsonLoadTransfer()用于完成数据格式的转换,将一些对象属性从基本类型转化成需要的类型(如mat(list)将类型从list转换成matrix),若对象只有Python基本类型则可以省略该方法。创建完整、可用对象过程是:

    obj = objectLoadFromFile()   
    obj.jsonLoadTransfer()

    下面的代码就是支持自定义对象进行JSON存储和解析的object_json模块源码。

    import json   
    import inspect    
    import pdb   
    def object2dict(obj):      
        #convert object to a dict      
        d = {'__class__':obj.__class__.__name__, '__module__':obj.__module__}      
        d.update(obj.__dict__)      
        return d   
    def objectDumps2File(obj, jsonfile):   
        objDict = object2dict(obj)   
        with open(jsonfile, 'w') as f:   
            f.write(json.dumps(objDict))   
    
    def dict2object(d):      
        '''convert dict to object, the dict will be changed'''       
        if'__class__' in d:      
            class_name = d.pop('__class__')      
            module_name = d.pop('__module__')      
            module = __import__(module_name)      
            #print 'the module is:', module      
            class_ = getattr(module,class_name)      
            args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args     
            #print 'the atrribute:', repr(args)   
            #pdb.set_trace()   
            inst = class_(**args) #create new instance      
        else:      
            inst = d      
        return inst   
    def objectLoadFromFile(jsonFile):   
        '''load json file and generate a new object instance whose __name__ filed  
        will be 'inst' '''  
        with open(jsonFile) as f:   
            objectDict =json.load(f)   
        obj = dict2object(objectDict)   
        return obj   
    #test function      
    if __name__  == '__main__':   
        class Person(object):      
            def __init__(self,name,age, **args):   
                obj_list = inspect.stack()[1][-2]   
                self.__name__ = obj_list[0].split('=')[0].strip()#object instance name   
                self.name = name      
                self.age = age   
    
            def __repr__(self):      
                return 'Person Object name : %s , age : %d' % (self.name,self.age)   
            def say(self):   
                #d = inspect.stack()[1][-2]   
                #print d[0].split('.')[0].strip()   
                return self.__name__  
            def jsonDumps(self, filename=None):   
                '''essential transformation to Python basic type in order to  
                store as json. dumps as objectname.json if filename missed '''  
                if not filename:   
                    jsonfile = self.__name__+'.json'   
                else: jsonfile = filename   
                objectDumps2File(self, jsonfile)   
    
            def jsonLoadTransfer(self):#TBD   
                '''essential transformation to object required type,such as  
                numpy matrix.call this function after newobject = objectLoadFromFile(jsonfile)'''  
                pass  
    
        p = Person('Aidan',22)        
        #json.dumps(p)#error will be throwed   
    
        #objectDumps2File(p,'Person.json')   
        p.jsonDumps()   
        p_l = objectLoadFromFile('p.json')   
    
        print 'the decoded obj type: %s, obj:%s' % (type(p_l),repr(p_l))

    Python类有新旧两种,py 2.2 后类定义继承 object 的目的是使这个类成为 new style class, 没有继承 object 的为传统classic class(最终也会继承object)。

    类定义中如下两种方法:

    class Person():   
    class Person(object)

    其区别在于:

    若创建新的Person instanc test,则type(test)的输出分别为:

    <type 'instance'>   
    <class '__main__.Person'>

    inspect 模块提供了一系列自省函数,它可以获取模块,类,方法,函数,traceback,帧对象,代码对象的信息。常用的方法getmembers,ismodule,getcallargs,isclass等,更多详细信息参见:http://docs.python.org/library/inspect.html。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。