全文共1990字,预计学习时长5分钟
![161e6410929dd59edad99797bfba945f.png](https://i-blog.csdnimg.cn/blog_migrate/70a57d661d64df067cbad0c64b310e3f.jpeg)
图源:unsplash
字典和列表是 Python的两种数据类型,也是用来处理JSON的完美工具。本文将主要分享以下内容:
· 如何载入、编写JSON?
· 如何在命令行上优化、校验JSON?
· 如何通过使用JMESPath对JSON文档执行高级查询?
1. JSON解码
Python自带一个功能强大、内容丰富的JSON库。可通过以下方式导入:
import json
解码JSON字符串很简单,直接输入 json.loads(…) 即可。它可以转换成:
· 字典对象
· 列表数组
· 识别布尔值、整数、浮点数和字符串,在Python中进行正确转换。
· 任何 null 都将被转换为Python的None类型。
以下为json.loads 的一个实例:
>>> import json>>> jsonstring = '{"name": "erik","age": 38, "married": true}'>>> json.loads(jsonstring){'name': 'erik', 'age': 38, 'married': True}
2.JSON编码
编码JSON也很简单。使用json.dumps(…) 把由字典、列表和其他本机类型组成的Python对象转换为字符串:
>>> myjson = {'name': 'erik', 'age': 38, 'married': True}>>> json.dumps(myjson)'{"name": "erik", "age": 38, "married":true}'
这其实是一个完全相同的文档,只是被转换成了字符串。所以,要想让JSON文档更易读,可使用缩进选项:
>>> print(json.dumps(myjson, indent=2)){ "name": "erik", "age": 38, "married": true}
3. 命令行用法
JSON库也可从命令行使用,以校验、优化JSON:
$ echo "{ "name": "Monty", "age":45 }" | python3 -m json.tool{ "name": "Monty", "age": 45}
如果你的电脑系统是Mac或Linux,并且能够安装JSON库的话,那么你也可以研究一下jq 命令行工具。它除了有便于记忆,可以润色代码等优点外,还有许多其他特点。
![46d2b38df8c8892a94fd9627d2840a56.png](https://i-blog.csdnimg.cn/blog_migrate/eb5690a1d59758c359389577a6973b6e.jpeg)
jq将在默认情况下优化JSON
4. 使用JMESPath搜索JSON
![9b833fb85464bd66eed31ad85eaaff85.png](https://i-blog.csdnimg.cn/blog_migrate/b6dfb71eb2873bc6c30273febfce830f.jpeg)
JMESPath是一种JSON查询语言。它能够让你轻松地从JSON文档中获取所需数据。如果你用过JSON,就会觉得获取嵌套值并不难。
例:doc["person"]["age"]将在一个如下所示的文档中获取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或pipenv。例如,在虚拟环境中使用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]>>>
![9be0e4a3ff3e404dcd52d9c3b3e561e6.png](https://i-blog.csdnimg.cn/blog_migrate/5ccedfd864a28f34dccc278b00edee79.jpeg)
现在就去试一试吧!请严格按照交互式教程操作,同时也不要忘了在JMESPath站点上查看示例哦!
![f16e3b9dde6900db31214f81436acc62.png](https://i-blog.csdnimg.cn/blog_migrate/84cd353ef4b0472b79c7fa6dc824964d.jpeg)
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范