一、json格式介绍
json格式是一种轻量级别的数据交换格式,容易被人识别和机器用来解析,它的全称叫做javaScript Object Notation
python json模块提供了api接口,可以将内存中的python对象转化为一个串行化表示,被叫做json。json被广泛的应用于ajax应用中的web服务器和客户端之间的通信,也可以用户其他程序的应用中。
二、json模块编码
json.dumps方法 encoded
import json
l=['iplaypython',[1,2,3], {'name':'xiaoming'}]
encoded_json = json.dumps(l)
print repr(l)
['iplaypython', [1, 2, 3], {'name': 'xiaoming'}]
print encoded_json
["iplaypython", [1, 2, 3], {"name": "xiaoming"}]
这样就将一个list列表对象,进行了json格式的编码转换
python json
dict object
list,tuple array
str,unicode string
int,long,float number
true true
false false
none null
三、json模块解码
json.loads()函数的解析方法 decoding
>>>print encoded_json
["iplaypython", [1, 2, 3], {"name": "xiaoming"}]
>>>decode_json = json.loads(encoded_json)
>>>print type(decode_json)
<type 'list'>
>>>print decode_json
[u'iplaypython', [1, 2, 3], {u'name': u'xiaoming'}]
json python
oject dict
array list
string unicode
number(int) int,long
number(real) float
true true
false false
null none
json.dumps方法提供了很多好用的参数可供选择,比较常用的有sort_keys(对dict对象进行排序,我们知道默认dict是无序存放的),separators,indent等参数
data1 = {'b':789,'c':456,'a':123}
data2 = {'a':123,'b':789,'c':456}
d1 = json.dumps(data1,sort_keys=True)
d2 = json.dumps(data2)
d3 = json.dumps(data2,sort_keys=True)
print d1
print d2
print d3
print d1==d2
print d1==d3
输出
{"a": 123, "b": 789, "c": 456}
{"a": 123, "c": 456, "b": 789}
{"a": 123, "b": 789, "c": 456}
False
True
indent参数是缩进的意思,它可以使得数据存储的格式变得更加优雅。
data1 = {'b':789,'c':456,'a':123}
d1 = json.dumps(data1,sort_keys=True,indent=4)
print d1
输出:
{
"a": 123,
"b": 789,
"c": 456
}
输出的数据被格式化之后,变得可读性更强,但是却是通过增加一些冗余的空白格来进行填充的。json主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据的大小的,无用的空格会占据很多通信带宽,所以适当时候也要对数据进行压缩。separator参数可以起到这样的作用,该参数传递是一个元组,包含分割对象的字符串。
print 'DATA:', repr(data)
print 'repr(data) :', len(repr(data))
print 'dumps(data) :', len(json.dumps(data))
print 'dumps(data, indent=2) :', len(json.dumps(data, indent=4))
print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))
输出
DATA: {'a': 123, 'c': 456, 'b': 789}
repr(data) : 30
dumps(data) : 30
dumps(data, indent=2) : 46
dumps(data, separators): 25
通过移除多余的空白符,达到了压缩数据的目的,而且效果还是比较明显的。
另一个比较有用的dumps参数是skipkeys,默认为False。 dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,则会比较优雅的过度。
data = {'b':789,'c':456,(1,2):123}
print json.dumps(data,skipkeys=True)
输出:
{"c": 456, "b": 789}