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基本类型则可以省略该方法。创建完整、可用对象过程是:

  1. obj = objectLoadFromFile()
  2. obj.jsonLoadTransfer()

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

Source Code:Copy

  1. import json
  2. import inspect
  3. import pdb
  4. def object2dict(obj):
  5. #convert object to a dict
  6. d = {‘__class__‘:obj.__class__.__name__, ‘__module__‘:obj.__module__}
  7. d.update(obj.__dict__)
  8. return d
  9. def objectDumps2File(obj, jsonfile):
  10. objDict = object2dict(obj)
  11. with open(jsonfile, ‘w‘) as f:
  12. f.write(json.dumps(objDict))
  13. def dict2object(d):
  14. ‘‘‘convert dict to object, the dict will be changed‘‘‘
  15. if‘__class__‘ in d:
  16. class_name = d.pop(‘__class__‘)
  17. module_name = d.pop(‘__module__‘)
  18. module = __import__(module_name)
  19. #print ‘the module is:‘, module
  20. class_ = getattr(module,class_name)
  21. args = dict((key.encode(‘ascii‘), value) for key, value in d.items()) #get args
  22. #print ‘the atrribute:‘, repr(args)
  23. #pdb.set_trace()
  24. inst = class_(**args) #create new instance
  25. else:
  26. inst = d
  27. return inst
  28. def objectLoadFromFile(jsonFile):
  29. ‘‘‘load json file and generate a new object instance whose __name__ filed
  30. will be ‘inst‘ ‘‘‘
  31. with open(jsonFile) as f:
  32. objectDict =json.load(f)
  33. obj = dict2object(objectDict)
  34. return obj
  35. #test function
  36. if __name__  == ‘__main__‘:
  37. class Person(object):
  38. def __init__(self,name,age, **args):
  39. obj_list = inspect.stack()[1][-2]
  40. self.__name__ = obj_list[0].split(‘=‘)[0].strip()#object instance name
  41. self.name = name
  42. self.age = age
  43. def __repr__(self):
  44. return ‘Person Object name : %s , age : %d‘ % (self.name,self.age)
  45. def say(self):
  46. #d = inspect.stack()[1][-2]
  47. #print d[0].split(‘.‘)[0].strip()
  48. return self.__name__
  49. def jsonDumps(self, filename=None):
  50. ‘‘‘essential transformation to Python basic type in order to
  51. store as json. dumps as objectname.json if filename missed ‘‘‘
  52. if not filename:
  53. jsonfile = self.__name__+‘.json‘
  54. else: jsonfile = filename
  55. objectDumps2File(self, jsonfile)
  56. def jsonLoadTransfer(self):#TBD
  57. ‘‘‘essential transformation to object required type,such as
  58. numpy matrix.call this function after newobject = objectLoadFromFile(jsonfile)‘‘‘
  59. pass
  60. p = Person(‘Aidan‘,22)
  61. #json.dumps(p)#error will be throwed
  62. #objectDumps2File(p,‘Person.json‘)
  63. p.jsonDumps()
  64. p_l = objectLoadFromFile(‘p.json‘)
  65. 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)。

类定义中如下两种方法:

Source Code:Copy

  1. class Person():
  2. class Person(object)

其区别在于:

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

Source Code:Copy

  1. <type ‘instance‘>
  2. <class ‘__main__.Person‘>

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

时间: 2024-11-07 12:50:02

Python实现支持JSON存储和解析的对象的相关文章

.net从网络接口地址获取json,然后解析成对象(二)

整理代码,这是第二种方法来读取json,然后反序列化成对象的,代码如下: 1 public static Order GetOrderInfo(string _tid, string _orderNo) 2 { 3 try 4 { 5 StringBuilder serviceUrl = new StringBuilder(); 6 serviceUrl.Append("http://10.10.10.10/queryOrderTwo?"); 7 serviceUrl.AppendFo

java 支持json单引号解析

I am trying to do this [see below], and it is throwing error. String x="{'candidateId':'k','candEducationId':1,'activitiesSocieties':'Activities for cand1'}"; ObjectMapper mapper = new ObjectMapper(); try { JsonNode df=mapper.readValue(x,JsonNod

8.7 JSON存储数据方式(JavaScript对象表示法)

JSON JavaScript 对象表示法(JavaScript Object Notation) 是一种存储数据的方式. 一.创建JSON对象 var gareen = {"name":"盖伦","hp":616}; 这样就创建了一个JSON 对象 JSON对象由 名称/值对组成 名称和值之间用冒号:隔开 名称必须用双引号" 包含起来 值可以是任意javascript数据类型,字符串,布尔,数字 ,数组甚至是对象 不同的名称/值对之间

Python -- Json 数据编码及解析

Python  --  Json  数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. 这个 sites 对象是包含 3 个站点记录(对象)的数组. { "sites": [ { "name":"菜鸟教程" , "url":"www.

Unity3d数据存储 PlayerPrefs,XML,Json数据的存储与解析

今天来复习一下数据存储方面的基础知识,Unity3d中常用的数据存储方式有Unity自带的PlayerPrefs, XML文档, Json文档,还有常用的轻量级数据库SQL, 涉及的琐碎知识非常多,在这里自己归纳总结一下,方便日后温故而知新. PlayerPrefs存储数据 PlayerPrefs的存储方式非常简单,但可用性不强,一般只用于调试过程存储少量数据,很少大范围使用 适用设备:Mac OSX, Linux, Windows,Web Players 存储机制:Key-Value (类似于

开源的轻量级JSON存储Kinto介绍

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/12/introducing-kinto Kinto是个提供了同步与分片功能的轻量级JSON存储服务,并且易于使用. 它在Mozilla内部得到了广泛的应用,基于Apache v2许可. 基本上,Kinto是个服务,client应用能够通过它存储和获取JSON数据.为了对这些数据提供同步与共享特性,Kinto引入了一些基本概念. Bucket:能够将bucket看作是命名空间

python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求

一.JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集.JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这

【Android开发经验】Json数据格式介绍、使用Android自带类库完成Json生成与解析

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 因为在之前的项目中,xml和json数据格式都有使用过,所以对json格式的简单.高效的特点印象深刻.如果使用json语言进行开发,强烈推荐使用json数据格式! JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成.  JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#,

python序列化:json,pickle,shelve

什么是序列化 什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化.在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等.程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输. 序列化的逆向过程,即为反序列化(unpickling),就是把序列化的对象(或者变量)重新读到内存中~ json模块 json 模块就用于序列化和反序