用 Python 解析 JSON 数据

如何使用 Python 解析 JSON 数据

JSON 近年来非常流行。它简单灵活,便于人类和机器理解和解析。JSON 数据由大括号中的键值对组成,键和值之间用冒号隔开。

Python 有许多处理 JSON 数据的工具、库和方法。这使得 Python 成为数据分析师、网络开发人员和数据科学家的热门选择。

在本指南中,我将介绍 JSON 语法和数据类型的基础知识。我还将讨论我们可以用来解析 JSON 数据的 Python 库和方法。我们还将介绍一些高级选项,这些选项非常适合网络数据搜刮。

什么是 JSON?

JSON 是一种基于文本的数据格式,用于表示结构化数据。它源于 JavaScript,但与语言无关,因此是不同语言编写的应用程序之间进行数据交换的理想选择。JSON 数据由键值对组成,类似于 Python 中的字典,并支持嵌套数据结构、数组等。

JSON 数据示例

{
"name": "John",
"age": 30,
"city": "New York",
"skills": ["Python", "Django", "Machine Learning"]
}

为什么使用 JSON?

JSON 广受欢迎有几个原因:

1. 人类可读: JSON 格式易于阅读和理解。

2. 重量轻 JSON 数据是 通常较小 比同等的 XML 数据更有价值。

3. 不依赖语言: 几乎所有编程语言都能解析和生成 JSON。

4. 灵活: JSON 支持嵌套结构和数组,使其成为表示复杂数据的多功能工具。

现在,在进入实际指南之前,我想提一下另一个选择(如果您注册,我不会收取佣金,不用担心)--Bright Data。我的公司使用 Bright Data 的网络搜刮 API 来搜索 LinkedIn,结果非常出色。

用 Python 解析 JSON 数据

Python 的标准库包含一个名为 `json` 的模块,它能让您轻松处理 JSON 数据。该模块提供了将 JSON 数据解析为 Python 对象和将 Python 对象转换为 JSON 字符串的方法。

加载 JSON 数据

"(《世界人权宣言》) 模块 提供了用于解析 JSON 字符串的 `json.loads()` 方法和用于解析文件中 JSON 数据的 `json.load()` 方法。

解析 JSON 字符串

要解析 JSON 字符串,请使用 `json.loads()` 方法:

import json
json_string = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_string)
print(data)
print(data['name'])

解析文件中的 JSON

要解析文件中的 JSON 数据,请使用 `json.load()` 方法:

import json
with open('data.json', 'r') as file:
data = json.load(file)
print(data)
print(data['age'])

编写 JSON 数据

`json` 模块还提供了将 Python 对象转换为 JSON 字符串和将 JSON 数据写入文件的方法。

将 Python 对象转换为 JSON 字符串

要将 Python 对象转换成 JSON 字符串,请使用 `json.dumps()` 方法:

import json
data = {
"name": "John",
"age": 30,
"city": "New York"
}
json_string = json.dumps(data)
print(json_string)

将 JSON 数据写入文件

要将 JSON 数据写入文件,请使用 `json.dump()` 方法:

import json
data = {
"name": "John",
"age": 30,
"city": "New York"
}
with open('data.json', 'w') as file:
json.dump(data, file)

处理复杂的 JSON 数据

JSON 数据可能很复杂,包含嵌套对象和数组。Python 的 `json` 模块能很好地处理这些复杂性。

嵌套 JSON 对象

请看下面嵌套的 JSON 数据:

{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York"
}
}

要访问嵌套数据,请使用相应的键:

import json
json_string = '''
{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York"
}
}
'''
data = json.loads(json_string)
print(data['address']['city'])

JSON 数组

JSON 还支持数组,可以包含多个对象或值:

{
"name": "John",
"age": 30,
"skills": ["Python", "Django", "Machine Learning"]
}

要访问 JSON 数组中的数据,请使用索引:

import json
json_string = '''
{
"name": "John",
"age": 30,
"skills": ["Python", "Django", "Machine Learning"]
}
'''
data = json.loads(json_string)
print(data['skills'][0])

JSON 解析中的错误处理

在处理 JSON 数据时,处理解析过程中可能出现的错误非常重要。`json` 模块会针对不同类型的错误引发特定的异常。

常见的 JSON 解析错误

- json.JSONDecodeError`:当 JSON 数据畸形时发生。

- 类型错误:当尝试序列化不可序列化对象时发生。

处理异常

要处理这些异常,可使用 try-except 块:

import json
json_string = '{"name": "John", "age": 30, "city": "New York"'
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f "JSONDecodeError: {e}")

使用应用程序接口和 JSON

许多网络 API 都以 JSON 格式返回数据(如我正在使用的 Bright Data 的 API)。Python 的 `requests` 库通常用于与 API 交互。让我们看看如何从 API 获取和解析 JSON 数据。

例如 从应用程序接口获取数据

import requests
response = requests.get('https://api.example.com/data')
data = response.json()
print(data)

在本例中,`response.json()` 方法直接解析 API 响应中的 JSON 数据。

JSON 和 Python 对象的互换性

JSON(JavaScript Object Notation,JavaScript 对象符号)是一种用于数据交换的字符串格式,其语法与 Python 的字典对象字面语法相似。但是,JSON 与 Python 字典不同。当 JSON 数据加载到 Python 时,会被转换成 Python 对象,通常是字典或列表。这样就可以使用标准 Python 方法进行操作。要将数据保存为 JSON 格式,需要使用 `json.dumps()` 函数。记住这两种格式的区别至关重要。

修改 JSON 数据

在 Python 中处理 JSON 时,可以通过添加、更新或删除元素来修改数据。我们将使用内置的 `json` 包,它提供了完成这些任务所需的基本功能。

添加元素

要在 JSON 对象中添加元素,可以使用标准字典语法:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
json_data['color'] = 'red'
print(json_data) # Output: {'model': 'Model X', 'year': 2022, 'color': 'red'}

更新元素

更新元素包括替换现有键值:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
json_data['year'] = 2023
print(json_data) # Output: {'model': 'Model X', 'year': 2023}

在字典中添加或更新值的另一种方法是使用 `update()` 方法。该方法使用另一个字典或包含键值对的可迭代字典中的值来添加或更新元素:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
more_json_string = '{"model": "Model S", "color": "Red"}'
more_json_data = json.loads(more_json_string)
json_data.update(more_json_data)
print(json_data) # Output: {'model': 'Model S', 'year': 2022, 'color': 'Red'}

删除元素

要从 JSON 对象中删除元素,请使用 `del` 关键字:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
del json_data['year']
print(json_data) # Output: {'model': 'Model X'}

或者,您也可以使用 `pop()` 方法,它可以同时获取值和删除值:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
year = json_data.pop('year')
print(year) # Output: 2022
print(json_data) # Output: {'model': 'Model X'}

如果元素不存在,使用 `del` 会引发 `KeyError` 异常。如果未找到键,`pop()` 方法将返回`None`。要安全地使用 `del`,请检查键是否存在,或将操作封装在 try-except 块中:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
if 'year' in json_data:
del json_data['year']
else:
print('Key not found')
# or wrapping the del operation with try-except
try:
del json_data['year']
except KeyError:
print('Key not found')

Python 错误处理:检查还是询问?

在 Python 中,错误处理有两种方法:"跳跃前检查 "和 "请求宽恕"。前者是在执行每个操作前检查程序状态,而后者是尝试操作并在操作失败时捕获异常。请求原谅 "方法在 Python 中更为常见,它假定错误是程序流程的常规部分。它提供了一种优雅的错误处理方式,使代码更易于阅读和编写。

保存 JSON

修改 JSON 数据后,您可能希望将其保存回 JSON 文件或导出为 JSON 字符串。json.dump()` 方法会将 JSON 对象保存到文件中,而 `json.dumps()` 则会返回对象的 JSON 字符串表示形式。

将 JSON 保存到文件

在写模式下使用 `json.dump()` 和 `open()` 上下文管理器:

import json
data = {"model": "Model X", "year": 2022}
with open("data.json", "w") as f:
json.dump(data, f)

将 Python 对象转换为 JSON 字符串

使用 `json.dumps()` 将字典转换为 JSON 字符串表示:

import json
data = {"model": "Model X", "year": 2022}
json_string = json.dumps(data)
print(json_string) # Output: {"model": "Model X", "year": 2022}

高级 JSON 解析技术

对于更高级的 JSON 解析,您可能需要使用自定义解码器或处理复杂的数据结构。

定制解码器

您可以通过子类化 `json.JSONDecoder` 来定义自定义解码行为:

import json
class CustomDecoder(json.JSONDecoder):
def decode(self, s):
data = super().decode(s)
# Add custom decoding logic here
return data
json_string = '{"name": "John", "age": 30}'
data = json.loads(json_string, cls=CustomDecoder)
print(data)

解析大型 JSON 文件

对于非常大的 JSON 文件,可以考虑使用 `ijson` 库,它能以增量方式解析 JSON 数据:

import ijson
with open(large_data.json, 'r') as file:
parser = ijson.items(file, 'item')
for item in parser:
print(item)

结论

有了 json 模块,用 Python 解析 JSON 数据就变得简单了。无论是处理基本的 JSON 字符串还是复杂的嵌套结构,Python 都能提供有效解析、操作和编写 JSON 数据所需的工具。通过学习基础知识和探索高级技术,您可以在 Python 应用程序中高效地管理数据交换。

在本指南中,我介绍了使用 Python 阅读和解析 JSON 数据的基础知识。我向您展示了如何使用 Python 内置的 json 包访问和修改 JSON 数据。我们还学习了更高级的解析选项,这些选项对于网络刮擦非常有用。

有任何问题?请在下方评论!

类似文章