码迷,mamicode.com
首页 > 编程语言 > 详细

python对象和json格式文本之间的转换

时间:2015-12-13 02:09:50      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

python进程中的实例和json格式的字符串之间的映射关系是非常直接的,相当于同一个概念被编码成不同的表示:

str in json form ----json.loads()-----> python object 

str in json form <----json.dumps()----- python object  

不过需注意类型的匹配,否则会报错。比如说json格式中大括号中的键值应当写成字符串。概念上json文本和python数据类型之间的对应关系是:

技术分享

 

    有没有觉得实在是太简单了!当然很重要的原因在于,json格式本身能很好的表达对象的概念。

PS: encode和decode这两个词的含义并没有明显的界限,都表示把同一个概念用不同的形式来表示。encode一般表示把概念在内存中的表示转换成在外存中的表示,decode则相反。

 

dumps()的参数

    json.dumps()方法提供了很多好用的参数可供选择,比较常用的有sort_keys,separators,indent等参数。

    参数值 sort_keys=True 表示对dict对象进行排序,我们知道默认dict是无序存放的。

    参数值 indent=4 是缩进的意思,它可以使得数据存储的格式变得更加优雅,json格式的字符串的逗号后具有换行符,花括号和中括号中的内容有缩进。当然,输出的数据被格式化之后,变得可读性更强,但是却是通过增加一些冗余的空白格来进行填充的。json主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据的大小的,无用的空格会占据很多通信带宽,所以适当时候也要对数据进行压缩。

    参数值 separator=(",", ":") 的作用是数据压缩,去除冗余空白,减小网络通信量。该参数传递是一个元组,包含分割对象的字符串。

    另一个比较有用的dumps参数是skipkeys,默认为False。 dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,则会比较优雅的过度。

 

    不过还是要注意,处理外部输入输出的语句,尽量都写在 try: 语句块中。

 

自定义对象-json映射

    需要自己实现函数。

 

技术分享
class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __repr__(self):
        return Person Object name : %s , age : %d % (self.name,self.age)
if __name__  == __main__:
    p = Person(Peter,22)
    print p


import json
 
p = Person.Person(Peter,22)
 
def object2dict(obj):
    #convert object to a dict
    d = {}
    d[__class__] = obj.__class__.__name__
    d[__module__] = obj.__module__
    d.update(obj.__dict__)
    return d
 
def dict2object(d):
    #convert dict to object
    if__class__ in d:
        class_name = d.pop(__class__)
        module_name = d.pop(__module__)
        module = __import__(module_name)
        class_ = getattr(module,class_name)
        args = dict((key.encode(ascii), value) for key, value in d.items()) #get args
        inst = class_(**args) #create new instance
    else:
        inst = d
    return inst
 
d = object2dict(p)
print d
#{‘age‘: 22, ‘__module__‘: ‘Person‘, ‘__class__‘: ‘Person‘, ‘name‘: ‘Peter‘}
 
o = dict2object(d)
print type(o),o
#<class ‘Person.Person‘> Person Object name : Peter , age : 22
 
dump = json.dumps(p,default=object2dict)
print dump
#{"age": 22, "__module__": "Person", "__class__": "Person", "name": "Peter"}
 
load = json.loads(dump,object_hook = dict2object)
print load
#Person Object name : Peter , age : 22
View Code

 

 直接实现文件的保存

    dump(obj,fp)load(obj,fp)直接实现文件的保存,它们具有文件指针fp作为参数,dump函数需要可写指针,load需要可读指针。

file pointer  <-------------->  python object

import json
 
jsonobj = json.load(open(jsonsource.dat, r))
json.dump(jsonobj, open(newjsonfile.dat, w))

    python中还有的pickle模块的用法也是类似的。

 

python对象和json格式文本之间的转换

标签:

原文地址:http://www.cnblogs.com/xinchrome/p/5042166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!