最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-27 14:25:00
文档

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

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


我们知道利用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等,

文档

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

Python实现支持JSON存储和解析的对象:我们知道利用JSON模块可方便的将Python基本类型(dict、list等)数据永久的存储成文件,同时也可以通过自定义转换函数和继承JSON encode&decode的方法实现自定义类的存储。本文就在前文 Python JSON模块的基础上,实现python支持JSON存储
推荐度:
标签: 实现 代码 对象
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top