Python 标准库之 JSON

本文字数:2159 字 阅读本文大概需要:6 分钟

写在之前

我用了两天的时间来介绍的 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 真的少了很多,也简单了很多?但是简单归简单,内容还是不能小觑的,上面的代码例子什么的,该看看,该在交互模式自己敲一敲就敲一敲,切勿眼高手低。

如果你觉得本篇文章对你有帮助的话,欢迎点赞,如果你有什么问题的话,欢迎在后台或者加微信联系我。

The end。

本文分享自微信公众号 - Python空间(Devtogether)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菲宇

Selenium常见元素定位方法和操作的学习介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

10720
来自专栏菲宇

jieba分词器详解及python实战

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

13220
来自专栏菲宇

Python Django使用HttpResponse返回图片并显示

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

14540
来自专栏菲宇

Django实现统计网站访问次数、访问 ip 、受访页面

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

18130
来自专栏数据派THU

史上最全 | 数据分析技能详细拆解,一张图覆盖全流程知识细节和资源推荐(附下载)

而基于这些数据的分析,可以挖掘到非常多有价值的信息,这些信息正在成为大多数企业业务增长、迭代更新的关键。

12830
来自专栏浊酒清味

Python进阶之Matplotlib入门(三)

Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

8820
来自专栏菲宇

Python操作MongoDB

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

6430
来自专栏浊酒清味

Python进阶之Matplotlib入门(二)

Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

9130
来自专栏机器学习与python集中营

奔走相告,Python 3.8.0 正式发布!

那么,这次新发布的 Python 3.8.0 有哪些重要的改进呢?以下是是 Python 3.8 相比 3.7 的新增特性。

5030
来自专栏菲宇

python的super()的作用和原理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

7020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励