15

4个小窍门,让你在Python中高效使用JSON

 3 years ago
source link: http://developer.51cto.com/art/202009/626007.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文转载自公众号“读芯术”(ID:AI_Discovery)。

字典和列表是 Python的两种数据类型,也是用来处理JSON的完美工具。本文将主要分享以下内容:

  • 如何载入、编写JSON?
  • 如何在命令行上优化、校验JSON?
  • 如何通过使用JMESPath对JSON文档执行高级查询?

R7ZJRr.jpg!mobile

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 命令行工具。它除了有便于记忆,可以润色代码等优点外,还有许多其他特点。

uEVZJvY.png!mobile

jq将在默认情况下优化JSON

4. 使用JMESPath搜索JSON

rqMFrue.png!mobile

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] 
>>> 

现在就去试一试吧!请严格按照交互式教程操作,同时也不要忘了在JMESPath站点上查看示例哦!

BFNrIzV.jpg!mobile

【责任编辑:赵宁宁 TEL:(010)68476606】


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK