Python 标准库之 JSON

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013486414/article/details/85531712

写在之前

我用了很长的篇幅来介绍 XML,如果没看的话建议先去看看之前的文章。就数据传递而言, XML 是一种选择,当然这里还有另一种选择 – 「JSON」。它是一种轻量级的数据交换格式,如果各位想要做 Web 编程的话,则肯定会用到它。下面我们就开始今天的学习。

JSON

首先我们参考《维基百科》中的相关内容,来对 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)
<class 'list'>
>>> type(data_json)
<class 'str'>

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 总是很小。

事实上对于真正的大数据,再大的 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 真的少了很多,也简单了很多?但是简单归简单,内容还是不能小觑的,上面的代码例子什么的,该看看,该在交互模式自己敲一敲就敲一敲,切勿眼高手低。

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013486414/article/details/85531712