在 Python 中使用 JSON

2025-06-04

在 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"
}
Enter fullscreen mode Exit fullscreen mode

通过这个例子,让我们来研究如何使用不同的 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)
Enter fullscreen mode Exit fullscreen mode

使用以下命令运行您的代码:

python test.py
Enter fullscreen mode Exit fullscreen mode

使用内置 JSON 模块的优点之一是您不必安装任何第三方库,从而可以最大限度地减少依赖性。

simplejson

simplejson是一个简单快速的 JSON 库,功能与内置模块类似。simplejson 的一个亮点是它由外部维护并定期更新。

您必须使用 pip 安装此模块。因此,在您的终端中,运行以下命令(最好在虚拟环境中):

pip install simplejson==3.16.0
Enter fullscreen mode Exit fullscreen mode

这个库的设计与内置模块非常相似,因此您甚至无需更改代码即可获得相同的功能!只需导入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)
Enter fullscreen mode Exit fullscreen mode

再次使用以下命令运行它:

python test.py
Enter fullscreen mode Exit fullscreen mode

许多 Python 开发人员建议在大多数情况下使用 simplejson 代替股票 json 库,因为它维护得很好。

UltraJSON

与 simplejson 类似,ujson是另一个由社区维护的 JSON 库。不过,ujson 是用 C 语言编写的,并且设计得非常快。它缺少一些内置 JSON 库所具备的高级功能,但它确实兑现了承诺,在速度方面似乎无与伦比。

使用以下命令安装 ujson:

pip install ujson==1.35
Enter fullscreen mode Exit fullscreen mode

与 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)
Enter fullscreen mode Exit fullscreen mode

使用以下命令运行它:

python test.py
Enter fullscreen mode Exit fullscreen mode

如果您正在处理非常大的数据集并且 JSON 序列化正在成为一项昂贵的任务,那么 ujson 是一个很好的库。

请求库

这些 JSON 序列化库很棒,但在现实世界中,处理 JSON 数据往往有更多背景信息。最常见的需要解码 JSON 的场景之一是向第三方 REST API 发出 HTTP 请求。

请求是用于发起 HTTP 请求的最流行的 Python 工具,它json()在 HTTP 请求完成后返回的响应对象上有一个非常棒的内置方法。拥有一个内置解决方案真是太好了,这样你就不必为了一个简单的任务而导入其他库了。

使用以下 shell 命令安装请求:

pip install requests==2.20.0
Enter fullscreen mode Exit fullscreen mode

在这个例子中,我们实际上要向每日天文图片 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'])
Enter fullscreen mode Exit fullscreen mode

此代码向 NASA 的 API 发出 HTTPGET请求,使用此内置方法解析返回的 JSON 数据,并打印出当前每日天文图片的解释。

使用以下命令运行您的代码:

python apod.py
Enter fullscreen mode Exit fullscreen mode

在 Flask 中使用 JSON 响应 HTTP 请求

另一个常见的场景是,你在 Web 应用程序上构建路由,并希望使用 JSON 数据响应请求。Flask一个流行的 Python 轻量级 Web 框架,它内置了一个jsonify函数来处理数据的序列化。

使用 pip 安装 Flask:

pip install flask==1.0.2
Enter fullscreen mode Exit fullscreen mode

现在创建一个名为 的新文件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()
Enter fullscreen mode Exit fullscreen mode

在这段代码中,我们有一个名为 的路由/apod,每当有GET请求发送到该路由时,apod()都会调用该函数。在这个函数中,我们假装返回“今日天文图片”。在这个例子中,我们返回的数据只是硬编码的,但您可以将其替换为任何其他来源的数据。

使用 运行该文件python app.py,然后在浏览器中访问http://localhost:5000/apod以查看 JSON 数据。

根据 Flask 文档,该jsonify函数以以下形式获取数据:

  1. 单个参数:直接传递给dumps()
  2. 多个参数:在传递给dumps()之前转换为数组
  3. 多个关键字参数:在传递给dumps()之前转换为字典
  4. args 和 kwargs:行为未定义并且会引发异常。

此函数包装了dumps()函数,添加了一些增强功能,使操作更加简便。它将 JSON 输出转换为mimetype 为 application/json 的Response对象。

结论

在 Python 中使用 JSON 有很多不同的解决方案,本文仅展示了几个示例。您可以根据个人需求选择合适的库,或者,在使用 Requests 和 Flask 的情况下,甚至可能不需要导入特定的 JSON 库。

如有任何问题或想展示您的成果,请随时联系我们:

文章来源:https://dev.to/twilio/working-with-json-in-python-4hd1
PREV
20 个 JavaScript 面试问题及答案
NEXT
您应该拥有的免费 React 资源。