头图

在 Python 中,读取和解析 JSON 数据是一项非常常见的任务。JSON 格式(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时易于机器解析和生成。Python 内置的 json 模块可以轻松地处理 JSON 数据,无论是从文件中读取 JSON,还是从字符串中解析 JSON,都是相当直接的。

json 模块的基本功能

json 模块提供了一些核心函数:

  1. json.load(f):从文件对象 f 中读取并解析 JSON 数据。
  2. json.loads(s):从字符串 s 中解析 JSON 数据。
  3. json.dump(obj, f):将 Python 对象 obj 写入到文件 f 中,作为 JSON 格式的数据。
  4. json.dumps(obj):将 Python 对象 obj 转换为 JSON 格式的字符串。

读取和解析 JSON 数据的基本步骤

为了展示如何使用 json 模块读取和解析 JSON 数据,我们可以用一个简单的例子来说明如何从文件中读取 JSON 数据并解析成 Python 对象。假设我们有一个名为 data.json 的文件,内容如下:

{
    "name": "John",
    "age": 30,
    "city": "New York",
    "children": [
        {
            "name": "Jane",
            "age": 10
        },
        {
            "name": "Doe",
            "age": 8
        }
    ]
}

这个文件存储了一个人的基本信息,其中包括他的名字、年龄、城市以及两个孩子的信息。接下来我们会用 Python 来读取这个文件,并解析其内容。

示例代码:从文件读取 JSON 数据并解析

以下是读取 data.json 文件并解析其内容的完整 Python 代码示例:

import json

# 定义要读取的文件路径
file_path = 'data.json'

# 打开并读取文件内容
with open(file_path, 'r', encoding='utf-8') as file:
    data = json.load(file)

# 输出解析后的数据
print(data)

# 访问 JSON 数据中的各个字段
print(f"Name: {data['name']}")
print(f"Age: {data['age']}")
print(f"City: {data['city']}")

# 遍历孩子的信息
for child in data['children']:
    print(f"Child Name: {child['name']}, Age: {child['age']}")

代码分析

  1. import json:导入 json 模块,它是处理 JSON 数据的核心工具。
  2. with open(file_path, 'r', encoding='utf-8') as file:使用 with 语句打开文件,这是一种 Python 中常见的文件操作模式,保证文件会在操作结束后自动关闭。我们以 utf-8 编码读取文件,以防止编码问题。
  3. json.load(file):将文件对象传递给 json.load() 函数,读取并解析文件内容为 Python 的字典或列表。
  4. print(data):输出整个解析后的 JSON 数据,它现在是一个 Python 的字典。
  5. 通过 data['name'], data['age'] 等方式访问 JSON 对象的字段。这是字典的典型操作方式。
  6. 使用 for 循环遍历 data['children'],访问孩子的信息。

解析 JSON 字符串

有时候 JSON 数据可能直接以字符串的形式提供,而不是存储在文件中。我们可以使用 json.loads() 来解析字符串形式的 JSON 数据。

假设我们有一个 JSON 字符串:

json_string = '{"name": "Alice", "age": 25, "city": "London"}'

我们可以使用以下代码解析这个字符串:

import json

# 定义 JSON 字符串
json_string = '{"name": "Alice", "age": 25, "city": "London"}'

# 解析 JSON 字符串
data = json.loads(json_string)

# 输出解析后的数据
print(data)

# 访问数据中的字段
print(f"Name: {data['name']}")
print(f"Age: {data['age']}")
print(f"City: {data['city']}")

这段代码与从文件读取的方式非常类似,只是这里我们将 JSON 字符串直接传递给 json.loads() 函数。

JSON 写入文件

Python 也可以很方便地将数据写入到 JSON 文件中,使用 json.dump() 函数可以将 Python 对象转换为 JSON 格式并写入文件。假设我们有以下 Python 数据:

person = {
    "name": "Bob",
    "age": 40,
    "city": "Chicago",
    "children": [
        {
            "name": "Anna",
            "age": 12
        },
        {
            "name": "Tom",
            "age": 7
        }
    ]
}

我们可以将这个数据写入到 output.json 文件中,代码如下:

import json

# 定义 Python 对象
person = {
    "name": "Bob",
    "age": 40,
    "city": "Chicago",
    "children": [
        {
            "name": "Anna",
            "age": 12
        },
        {
            "name": "Tom",
            "age": 7
        }
    ]
}

# 将数据写入到文件
with open('output.json', 'w', encoding='utf-8') as file:
    json.dump(person, file, ensure_ascii=False, indent=4)

代码分析

  1. json.dump(person, file, ensure_ascii=False, indent=4)json.dump() 将 Python 对象写入文件。ensure_ascii=False 确保非 ASCII 字符能够被正确处理,比如中文字符。indent=4 参数用于美化输出,使得生成的 JSON 文件更易于阅读。
  2. 文件会自动写入 output.json 中,内容格式化后的样子如下:
{
    "name": "Bob",
    "age": 40,
    "city": "Chicago",
    "children": [
        {
            "name": "Anna",
            "age": 12
        },
        {
            "name": "Tom",
            "age": 7
        }
    ]
}

处理复杂的 JSON 结构

在实际应用中,JSON 数据的结构可能非常复杂,嵌套多个层次的对象和数组。在这种情况下,Python 的 json 模块依旧能够轻松处理。例如,我们有一个包含更复杂数据结构的 JSON:

{
    "status": "success",
    "data": {
        "users": [
            {
                "id": 1,
                "name": "Alice",
                "emails": ["alice@example.com", "alice.work@example.com"]
            },
            {
                "id": 2,
                "name": "Bob",
                "emails": ["bob@example.com"]
            }
        ]
    },
    "meta": {
        "count": 2
    }
}

解析并提取这些复杂数据的代码如下:

import json

# 定义要解析的 JSON 数据
json_data = '''
{
    "status": "success",
    "data": {
        "users": [
            {
                "id": 1,
                "name": "Alice",
                "emails": ["alice@example.com", "alice.work@example.com"]
            },
            {
                "id": 2,
                "name": "Bob",
                "emails": ["bob@example.com"]
            }
        ]
    },
    "meta": {
        "count": 2
    }
}
'''

# 解析 JSON 数据
data = json.loads(json_data)

# 输出用户数据
for user in data['data']['users']:
    print(f"User ID: {user['id']}, Name: {user['name']}")
    print("Emails:")
    for email in user['emails']:
        print(f"  {email}")

# 输出 meta 数据
print(f"Total user count: {data['meta']['count']}")

错误处理

在处理 JSON 数据时,可能会遇到格式错误或数据缺失的问题。为了让程序更健壮,我们需要在解析 JSON 时捕获异常。json 模块的 JSONDecodeError 异常可以帮助我们处理解析错误:

import json

json_string = '{"name": "Alice", "age": 25, "city": "London"'  # 缺少右括号

try:
    data = json.loads(json_string)
except json.JSONDecodeError as e:
    print(f"JSON Decode Error: {e}")

这里,json.loads() 试图解析一个格式不正确的 JSON 字符串,由于缺少右括号,它会抛出 JSONDecodeError 异常。通过捕获这个异常,我们可以为用户提供更友好的错误提示。

总结

无论是从文件中读取 JSON 数据,还是直接解析字符串形式的 JSON,Python 的 json 模块都提供了极为简便的操作方式。你可以通过 json.load() 从文件中读取 JSON,通过 json.loads() 解析 JSON 字符串,并且可以用 json.dump()json.dumps() 将 Python 对象转化为 JSON 格式的数据。

通过这些示例代码,你可以处理简单到复杂的 JSON 结构,并且可以通过异常捕获提高程序的健壮性。


注销
1k 声望1.6k 粉丝

invalid