在 Python 中有效使用 JSON 的6个技巧

共 3061字,需浏览 7分钟

 ·

2021-03-23 17:24

点击下面卡片关注AI算法与图像处理”,选择加"星标"或“置顶”

重磅干货,第一时间送达


引言


JSON(JavaScript对象表示法的缩写)是一种开放标准。虽然它的名字并不意味着这样,但它是一种独立于语言的数据格式。JSON 用于存储和交换数据。它是一种流行的数据格式,因为它也很容易为人类读写。在 Python 中使用 JSON 非常简单!Python 有两种数据类型,它们组成了在 Python 中使用 JSON 的完美工具: dictionary 和 lists。


用 Python 导入 JSON 库


Python 附带了一个强大而优雅的 JSON 库,可以帮助你对 JSON 进行解码和编码。它可以通过以下方式导入:

import json

1. 如何在 Python 中解析 JSON


解析 JSON 数据的字符串(也称为解码 JSON)就像使用 JSON.load (...)(load 是 load string 的缩写)一样简单。


下面是一个使用 json.loads 的例子:

>>> jsonstring = '{"name": "erik", "age": 38, "married": true}'>>> data = json.loads(jsonstring)>>> print(data){'name': 'erik', 'age': 38, 'married': True}

输出可能看起来像字符串,但实际上它是一个字典,我们可以在代码中使用它,例如:

>>> type(data)<class 'dict'>>>> print('Hello', data['name'], "you're", data['age'], 'years old')Hello erik you're 38 years old

2. 用 Python 编码 JSON


使用Python编码JSON数据就像解码一样容易。使用 json.dumps (...)(“ dump to string”的缩写)将包含 dictionary、 lists 和其他类型的 Python 对象转换为字符串:

>>> data = {'name': 'erik', 'age': 38, 'married': True} >>> json.dumps(data) '{"name": "erik", "age": 38, "married": true}'

这是同一个文档,转换回一个字符串!如果你想让 JSON 文档对于人们来说更具可读性,请使用缩进选项。它将很好地格式化 JSON,使用空格字符:

>>> data = {'name': 'erik', 'age': 38, 'married': True}>>> print(json.dumps(data, indent=2)){  "name": "erik",  "age": 38,  "married": true}

3. 使用 JSON 模块漂亮地打印 JSON


Python 的 JSON 模块也可以在命令行中使用:

$ echo "{ \"name\": \"Monty\", \"age\": 45 }" | \ python3 -m json.tool{     "name": "Monty",    "age": 45}

如果你对此感兴趣,可以尝试使用jq工具。


4. 如何用 python 读取 JSON 文件


除了 json.loads 之外,还有一个名为 json.load 的函数(不带 s)。它将从文件中加载数据。如果你想把 JSON 文件的内容读入 Python 并解析它,可以使用下面的例子:

with open('data.json') as json_file:    data = json.load(json_file)    ...

5. 如何在 Python 中将 JSON 写入文件


json.dump函数用于将数据写入JSON文件。

data = {'name': 'Eric', 'age': 38 }with open('data.json', 'w') as json_file:    json.dump(data, json_file)

6. 使用 JMESPath 搜索 JSON

JMESPath是JSON的查询语言。它允许你轻松地从 JSON 文档中获取所需的数据。如果你以前使用过 JSON,你可能知道获取嵌套值很容易。


例如: doc [“ person”][“ age”]会在一个文档中给出年龄的嵌套值,如下所示:

{  "persons": {    "name": "erik",    "age": "38"  }}

但是如果你想从一组人中提取出所有的年龄字段,在一个文档中像这样:

{  "persons": [    { "name": "erik", "age": 38 },    { "name": "john", "age": 45 },    { "name": "rob", "age": 14 }  ]}

我们可以编写一个简单的循环,遍历所有的人。但是循环速度很慢,给代码带来了复杂性。这就是 JMESPath 的用武之地!


这个 JMESPath 表达式可以完成任务:

persons[*].age

它将返回一个包含所有年龄段的数组: [38,45,14]。


假设你想过滤这个列表,只得到名为‘erik’的人的年龄。你可以使用一个过滤器:

persons[?name=='erik'].age

看看这是多么自然和快捷!


JMESPath不是Python标准库的一部分,这意味着你需要使用pip来安装它。

$ pip3 install jmespath$ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)>>> import jmespath>>> j = { "people": [{ "name": "erik", "age": 38 }] }>>> jmespath.search("people[*].age", j)[38]>>>


个人微信(如果没有备注不拉群!
请注明:地区+学校/企业+研究方向+昵称



下载1:何恺明顶会分享


AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析


下载2:终身受益的编程指南:Google编程风格指南


AI算法与图像处理」公众号后台回复:c++,即可下载。历经十年考验,最权威的编程规范!



下载3 CVPR2021

AI算法与图像处公众号后台回复:CVPR即可下载1467篇CVPR 2020论文 和 CVPR 2021 最新论文

点亮 ,告诉大家你也在看



浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报