我用了很长的篇幅来介绍 XML,如果没看的话建议先去看看之前的文章。就数据传递而言, XML 是一种选择,当然这里还有另一种选择 – 「JSON」。它是一种轻量级的数据交换格式,如果各位想要做 Web 编程的话,则肯定会用到它。下面我们就开始今天的学习。
首先我们参考《维基百科》中的相关内容,来对 JSON 做如下介绍:
JSON ( JavaScript Object Notation )
是一种由道格拉斯构想设计、轻量级的数据交换语言,以文字为基础,且易于让人阅读。尽管 JSON 是 JavaScript 的一个子集,但
JSON 是独立于语言的文本格式,并且采用了类似 C 语言家族的一些习惯。 关于 JSON
更为详细的内容,可以参考其官方网站,在这我截取部分内容,让大家更好的了解一下 JSON 的结构。
JSON 构建于两种结构基础之上:
“名称/值”对的集合。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table)等。
值的有序列表。在某些语言中,它被理解为数组(array),类似于 Python 中的类表。
Python 标准库中有 JSON 模块,主要是执行序列化和反序列化功能。
序列化:encoding,把一个 Python 对象编码转化成 JSON 字符串;
反序列化:decoding,把 JSON 格式字符串解码转换为 Python 数据对象。
JSON 模块相比于 XML 来说真的是简单多了:
>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']
1.encoding:dumps()
>>> data = [{'name':'rocky','like':('python','c++'),'age':23}]
>>> data
[{'name': 'rocky', 'like': ('python', 'c++'), 'age': 23}]
>>> data_json = json.dumps(data)
>>> data_json
'[{"name": "rocky", "like": ["python", "c++"], "age": 23}]'
encoding 的操作比较简单,请仔细观察一下上面代码中 data 和 data_json 的不同:like 的值从元组变成了列表,其实还有不同,请看下面:
>>> type(data)
>>> type(data_json)
2.decoding:loads()
decoding 的过程其实也像上面那么简单:
>>> new_data = json.loads(data_json)
>>> new_data
[{'name': 'rocky', 'like': ['python', 'c++'], 'age': 23}]
上面需要注意的是,解码之后并没有将值中的列表还原为数组。上面的 data 都不是很长,还能凑活着看,如何很长,阅读其实就很有难度了。所以 JSON 的 dumps() 提供了可选的参数,利用它们能在输入上对人更好,当然这个对机器来说都是无所谓的事情。
>>> data1 = json.dumps(data,sort_keys = True,indent = 2)
>>> print(data1)
[
{
"age": 23,
"like": [
"python",
"c++"
],
"name": "rocky"
}
]
sort_keys = True 的意思是按照键的字典顺序排序;indent = 2 则是让每个键值对显示的时候,以缩进两个字符对齐,这样的视觉效果就好多了。
其实如果数据不是很大的话,上面的那些基本操作就足够了。但现在不是都讲究什么都是「大数据」嘛,很多人都在吹嘘自己是大数据,显然不能让 JSON 总是很小。
事实上对于真正的大数据,再大的 JSON 也不够,前面的操作方法是将数据都读入内存,如果数据太大的话就会溢出。那么这个时候该怎么办呢?别怕,我们是 Python 啊,早都想到了,Python 中提供了一个 tempfile 的模块解决此类问题。这里需要注意的是,跟上面已经用过的函数相比是不同的,请仔细观察。
>>> import tempfile
>>> data = [{'name':'rocky','like':('python','c++'),'age':23}]
>>> f = tempfile.NamedTemporaryFile(mode = 'w+')
>>> json.dump(data,f)
>>> f.flush()
>>> print(open(f.name,'r').read())
[{"name": "rocky", "like": ["python", "c++"], "age": 23}]
差不多 JSON 就是这些内容了,是不是比起 XML 真的少了很多,也简单了很多?但是简单归简单,内容还是不能小觑的,上面的代码例子什么的,该看看,该在交互模式自己敲一敲就敲一敲,切勿眼高手低。