在网页爬虫中经常需要传输和解析json数据,JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,所以我们更倾向于选择JSON来交换数据。
JSON有两种表示结构,对象和数组。对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。
{
key1:value1,
key2:value2,
...
}
其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组。
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。
[
{
key1:value1,
key2:value2
},
{
key3:value3,
key4:value4
}
]
python2.6版本开始加入了JSON模块,python的json模块序列化与反序列化的过程分别是encoding和decoding。序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等。反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。
json模块提供四个功能:dumps, dump, loads, load。
# dumps功能
# 将数据通过特殊的形式转换为所有程序语言都认识的字符串
>>> import json
>>> data = ['aa', 'bb', 'cc']
>>> j_str = json.dumps(data)
>>> j_str
'["aa", "bb", "cc"]'
# loads功能
# 将json编码的字符串再转换为python的数据结构
>>> j_str
'["aa", "bb", "cc"]'
>>> mes = json.loads(j_str)
>>> mes
['aa', 'bb', 'cc']
# dump功能
# 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
with open('D:/tmp.json', 'w') as f:
json.dump(data, f)
# load功能
# 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构
with open('D:/tmp.json', 'r') as f:
data = json.load(f)
除了对列表进行序列化,还可以对字典及嵌套字典进行序列化。
# 示例
import json
dict1={'name1':['data11','data12'],'name2':['data21','data22']}
dict2={'name1':{'name11':['data11','data12']},'name2':['data21','data22']}
_json=json.dumps(dict1)
data2 =json.loads(_json)
print type(_json)
print type(data2)
print dict2['name1']['name11']
# 输出结果
<type 'str'>
<type 'dict'>
['data11', 'data12']
参考链接:
JSON详解
python-Json
Python处理JSON