在 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 的例子:
'{"name": "erik", "age": 38, "married": true}' > jsonstring =
> data = json.loads(jsonstring)
> print(data)
{'name': 'erik', 'age': 38, 'married': True}
输出可能看起来像字符串,但实际上它是一个字典,我们可以在代码中使用它,例如:
> type(data)
<class 'dict'>
'Hello', data['name'], "you're", data['age'], 'years old') > print(
Hello erik you're 38 years old
2. 用 Python 编码 JSON
使用Python编码JSON数据就像解码一样容易。使用 json.dumps (...)(“ dump to string”的缩写)将包含 dictionary、 lists 和其他类型的 Python 对象转换为字符串:
'name': 'erik', 'age': 38, 'married': True} >>> data = {
json.dumps(data) '{"name": "erik", "age": 38, "married": true}'
这是同一个文档,转换回一个字符串!如果你想让 JSON 文档对于人们来说更具可读性,请使用缩进选项。它将很好地格式化 JSON,使用空格字符:
'name': 'erik', 'age': 38, 'married': True} > data = {
2)) > print(json.dumps(data, indent=
{
"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
$ python3
Python 3.8.2 (default, Jul 16 2020, 14:00:26)
> import jmespath
"people": [{ "name": "erik", "age": 38 }] } > j = {
"people[*].age", j) > jmespath.search(
[38]
>
个人微信(如果没有备注不拉群!) 请注明:地区+学校/企业+研究方向+昵称
下载1:何恺明顶会分享
在「AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析
下载2:终身受益的编程指南:Google编程风格指南
在「AI算法与图像处理」公众号后台回复:c++,即可下载。历经十年考验,最权威的编程规范!
下载3 CVPR2021 在「AI算法与图像处理」公众号后台回复:CVPR,即可下载1467篇CVPR 2020论文 和 CVPR 2021 最新论文 点亮 ,告诉大家你也在看