在 Python 中使用 JSON
开发人员经常需要处理各种不同格式的数据,JSON(JavaScript 对象表示法的缩写)是 Web 开发中最流行的格式之一。这是 JavaScript 语言用来表示对象的语法。
作为一名 Python 开发者,你可能会注意到它看起来与 Python 字典惊人地相似。在 Python 中处理 JSON 有几种不同的解决方案,而这些数据通常被加载到字典中。
在本文中,我们将使用来自NASA 每日天文图片 API的以下经过修改的 JSON 数据。导航到要运行示例代码的位置,创建一个名为 的文件apod.json
,并向其中添加以下内容:
{
"copyright": "Yin Hao",
"date": "2018-10-30",
"explanation": "Meteors have been shooting out from the constellation of Orion...",
"hdurl": "https://apod.nasa.gov/apod/image/1810/Orionids_Hao_2324.jpg",
"media_type": "image",
"service_version": "v1",
"title": "Orionids Meteors over Inner Mongolia",
"url": "https://apod.nasa.gov/apod/image/1810/Orionids_Hao_960.jpg"
}
通过这个例子,让我们来研究如何使用不同的 Python 库解码和编码这些数据。
标准库
让我们从显而易见的选择开始: Python 标准库中的原生 JSON 模块。这个库以一种相当易用的方式完成了 JSON 的编码和解码任务。许多其他 JSON 库的 API 都基于这个库,并且行为方式也类似。
创建一个名为的文件test.py
并将以下代码粘贴到其中,以解码apod.json
文本文件中的 JSON,将其存储在 Python 字典中,然后将其解码回字符串:
import json
with open('apod.json', 'r') as f:
json_text = f.read()
# Decode the JSON string into a Python dictionary.
apod_dict = json.loads(json_text)
print(apod_dict['explanation'])
# Encode the Python dictionary into a JSON string.
new_json_string = json.dumps(apod_dict, indent=4)
print(new_json_string)
使用以下命令运行您的代码:
python test.py
使用内置 JSON 模块的优点之一是您不必安装任何第三方库,从而可以最大限度地减少依赖性。
simplejson
simplejson是一个简单快速的 JSON 库,功能与内置模块类似。simplejson 的一个亮点是它由外部维护并定期更新。
您必须使用 pip 安装此模块。因此,在您的终端中,运行以下命令(最好在虚拟环境中):
pip install simplejson==3.16.0
这个库的设计与内置模块非常相似,因此您甚至无需更改代码即可获得相同的功能!只需导入simplejson
模块,并为其指定名称json
,上一个示例中的其余代码即可正常工作。
如果要使用 simplejson 进行编码和解码,请将上面的代码替换为以下内容:
import simplejson as json
with open('apod.json', 'r') as f:
json_text = f.read()
# Decode the JSON string into a Python dictionary.
apod_dict = json.loads(json_text)
print(apod_dict['explanation'])
# Encode the Python dictionary into a JSON string.
new_json_string = json.dumps(apod_dict, indent=4)
print(new_json_string)
再次使用以下命令运行它:
python test.py
许多 Python 开发人员建议在大多数情况下使用 simplejson 代替股票 json 库,因为它维护得很好。
UltraJSON
与 simplejson 类似,ujson是另一个由社区维护的 JSON 库。不过,ujson 是用 C 语言编写的,并且设计得非常快。它缺少一些内置 JSON 库所具备的高级功能,但它确实兑现了承诺,在速度方面似乎无与伦比。
使用以下命令安装 ujson:
pip install ujson==1.35
与 simplejson 一样,您无需更改任何代码即可使其正常工作。在大多数情况下,从开发人员的角度来看,它的工作方式与内置模块相同。请将之前的代码替换为以下内容:
import ujson as json
with open('apod.json', 'r') as f:
json_text = f.read()
# Decode the JSON string into a Python dictionary.
apod_dict = json.loads(json_text)
print(apod_dict['explanation'])
# Encode the Python dictionary into a JSON string.
new_json_string = json.dumps(apod_dict, indent=4)
print(new_json_string)
使用以下命令运行它:
python test.py
如果您正在处理非常大的数据集并且 JSON 序列化正在成为一项昂贵的任务,那么 ujson 是一个很好的库。
请求库
这些 JSON 序列化库很棒,但在现实世界中,处理 JSON 数据往往有更多背景信息。最常见的需要解码 JSON 的场景之一是向第三方 REST API 发出 HTTP 请求。
请求库是用于发起 HTTP 请求的最流行的 Python 工具,它json()
在 HTTP 请求完成后返回的响应对象上有一个非常棒的内置方法。拥有一个内置解决方案真是太好了,这样你就不必为了一个简单的任务而导入其他库了。
使用以下 shell 命令安装请求:
pip install requests==2.20.0
在这个例子中,我们实际上要向每日天文图片 API 发出 HTTP 请求,而不是使用.json
其他例子中的本地硬编码文件。
打开一个名为的新文件apod.py
并向其中添加以下代码:
import requests
apod_url = 'https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY'
apod_dict = requests.get(apod_url).json()
print(apod_dict['explanation'])
此代码向 NASA 的 API 发出 HTTPGET
请求,使用此内置方法解析返回的 JSON 数据,并打印出当前每日天文图片的解释。
使用以下命令运行您的代码:
python apod.py
在 Flask 中使用 JSON 响应 HTTP 请求
另一个常见的场景是,你在 Web 应用程序上构建路由,并希望使用 JSON 数据响应请求。Flask是一个流行的 Python 轻量级 Web 框架,它内置了一个jsonify函数来处理数据的序列化。
使用 pip 安装 Flask:
pip install flask==1.0.2
现在创建一个名为 的新文件app.py
,其中将存放我们的示例 Web 应用程序的代码:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/apod', methods=['GET'])
def apod():
url = 'https://apod.nasa.gov/apod/image/1810/Orionids_Hao_960.jpg'
title = 'Orionids Meteors over Inner Mongolia'
return jsonify(url=url, title=title)
if __name__ == '__main__':
app.run()
在这段代码中,我们有一个名为 的路由/apod
,每当有GET
请求发送到该路由时,apod()
都会调用该函数。在这个函数中,我们假装返回“今日天文图片”。在这个例子中,我们返回的数据只是硬编码的,但您可以将其替换为任何其他来源的数据。
使用 运行该文件python app.py
,然后在浏览器中访问http://localhost:5000/apod以查看 JSON 数据。
根据 Flask 文档,该jsonify
函数以以下形式获取数据:
- 单个参数:直接传递给dumps()。
- 多个参数:在传递给dumps()之前转换为数组。
- 多个关键字参数:在传递给dumps()之前转换为字典。
- args 和 kwargs:行为未定义并且会引发异常。
此函数包装了dumps()函数,添加了一些增强功能,使操作更加简便。它将 JSON 输出转换为mimetype 为 application/json 的Response对象。
结论
在 Python 中使用 JSON 有很多不同的解决方案,本文仅展示了几个示例。您可以根据个人需求选择合适的库,或者,在使用 Requests 和 Flask 的情况下,甚至可能不需要导入特定的 JSON 库。
如有任何问题或想展示您的成果,请随时联系我们:
- 电子邮件: Sagnew@twilio.com
- 推特:@Sagnewshreds
- GitHub:Sagnew
- Twitch(直播代码):Sagnewshreds