您的位置:首页 > 编程语言 > Python开发

用Python3处理JSON

2015-10-02 13:46 573 查看
本文转载自/article/3500880.html(略作修改)

在python中提供了标准库json将基本类型的数据转化成json格式,但是在涉及到自定义类型时需要扩展或者复写Encoder(Decoder)来实现,默认情况下json会抛出”TypeErro: xxx is not json serializable”的错误。本文参考了文章Json概述以及python对json的相关操作



在json反序列化过程中基本类型和Python3基本类型的对应关系:

JSONPython
Objectdict
Arraylist
Stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone

基本类型的序列化/反序列化

对于基本类型的数据直接使用json.dumps和json.loads方法进行序列化和反序列化。

import json

array = ['d', 'b', 'c', 'a', {'b':100, 'a':'letter a'}]
encodestr = json.dumps(array)
org_obj = json.loads(encodestr)


序列化函数dumps的几个常用参数:

separators: 指定生成的json字符串所用的分隔符,两个分别用于代替“,”、“:”。

indent: 用于格式化生成的json字符串,接受整数参数的缩进量。

sort_keys: True/False,指定dict在序列化时是否按照key排序。

例如:

json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4, separators=(',', ': '))


自定义类型的序列化——使用函数

json.dumps
函数接受参数default用于指定一个函数,该函数能够把自定义类型的对象转换成可序列化的基本类型。
json.loads
函数接受参数object_hook用于指定函数,该函数负责吧反序列化后的基本类型对象转换成自定义类型的对象。

boy1 = boy('Will', 20)

#default method for decode
def boydefault(obj):
if isinstance(obj, boy):
return {'name': obj.name, 'age': obj.age}
return obj;

def boyhook(dic):
print('test')
if dic['name']:
return boy(dic['name'], dic['age'])
return dic

boy_encode_str = json.dumps(boy1, default=boydefault)
new_boy = json.loads(boy_encode_str, object_hook=boyhook)
print(boy_encode_str)
print(new_boy)


自定义类型的序列化——使用类

除此以外json库提供了JSONEncoder和JSONDecoder两个类用于json的序列化和反序列化,可以通过子类实现自定义类的json操作(估计json库内部逻辑也是用的这两个类)。

json.JSONEncoder的主要方法:

default:目的和dumps的default参数一样。

encode:实现序列化的逻辑部分。

json.JSONEncoder
的方法就是default。这里有两个思路一个是重载
json.JSONDecoder
的构造函数设置object_hook,另一个是重载decode方法添加由dict转换为自定义类的逻辑。

class BoyEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, boy):
return {'name': o.name, 'age': o.age}
return json.JSONEncoder.default(o);

#override decode method
class BoyDecoder(json.JSONDecoder):
def decode(self, s):
dic = super().decode(s);
return boy(dic['name'], dic['age']);

#override __init__ method
class BoyDecoder2(json.JSONDecoder):
def __init__(self):
json.JSONDecoder.__init__(self)
self.object_hook = boyhook

boy_encode_str = json.dumps(boy1, cls=BoyEncoder)
new_boy = json.loads(boy_encode_str, cls=BoyDecoder)
new_boy2 = json.loads(boy_encode_str, cls=BoyDecoder2)
print(boy_encode_str)
print(new_boy)
print(new_boy2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: