data len is: 30
4 indented data:
{
"a": 123,
"b": 789,
"c": 456
}
decoded DATA: u'b': 789}
len of decoded DATA: 33
json主要是作为一种数据通信的格式存在的,无用的空格会浪费通信带宽,适当时候也要对数据进行压缩。separator参数可以起到这样的作用,该参数传递是一个元组,包含分割对象的字符串,其实质就是将Python默认的(‘, ‘,': ‘)分隔符替换成(’,’,':’)。
1
2
3
4
5
6
data :::123}
data)
data))
json.
json.
json.
输出:
1
2
3
4
5
DATA: : : 789}
repr(data) : 30
dumps(data) : 30
dumps: 46
dumps(data, separators): 25
另一个比较有用的dumps参数是skipkeys,默认为False。 dumps方法存储dict对象时key必须是str类型,其他类型会导致TypeError异常产生,如果将skipkeys设为True则会优雅的滤除非法keys。
1
2
3
data :::123}
data)
json.
输出:
1
2
original data: : : : 789}
json encoded : 789}
2,JSON处理自定义数据类型
json模块不仅可以处理普通的python内置类型,也可以处理我们自定义的数据类型,而往往处理自定义的对象是很常用的。
如果直接通过json.dumps方法对Person的实例进行处理的话,会报错,因为json无法支持这样的自动转化。通过上面所提到的json和 python的类型转化对照表,可以发现,object类型是和dict相关联的,所以我们需要把我们自定义的类型转化为dict,然后再进行处理。这里,有两种方法可以使用。
方法一:自己写转化函数
自定义object类型和dict类型进行转化:encode-定义函数 object2dict()将对象模块名、类名以及__dict__存储在一个字典并返回;decode-定义dict2object()解析出模块名、类名、参数,创建新的对象并返回。在json.dumps()中通过default参数指定转化过程中调用的函数;json.loads()则通过 object_hook指定转化函数。
方法二:继承JSONEncoder和JSONDecoder类,覆写相关方法
JSONEncoder类负责编码,主要是通过其default函数进行转化,我们可以重载该方法。对于JSONDecoder,亦然。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#handling private data type
#define class
:
name,age):
self.name = name
self.age = age
:
..age)
#define transfer functions
def object2dict(obj):
#convert object to a dict
d :obj.__class__.__name__, '__module__':obj.__module__}
d.
return d
def dict2object(d):
#convert dict to object
d:
class_name
module_name
module module_name)
module
class_ module,class_name)
args key.value
args)
inst = class_(**args) #create new instance
else:
inst = d
return inst
#recreate the default method
class LocalEncoder(json.JSONEncoder):
obj):
#convert object to a dict
d :obj.__class__.__name__, '__module__':obj.__module__}
d.
return d
class LocalDecoder(json.JSONDecoder):
:
json.object_hook
d):
#convert dict to object
d:
class_name
module_name
module module_name)
class_ module,class_name)
args key.value
inst = class_(**args) #create new instance
else:
inst = d
return inst
#test function
if __name__ == '__main__':
p
print p
#json.dumps(p)#error will be throwed
d = object2dict(p)
d
o = dict2object(d)
oo))
dump = json.dumps(p,default=object2dict)
dump
load = json.loads(dump,object_hook = dict2object)
load
d p)
o d)
d
o),o
输出:
1
2
3
4
5
6
7
8
9
10
11