用 Python 解析 JSON 的指南

评论: 0

JSON 是 JavaScript Object Notation 的缩写。它不仅轻量级,而且便于人类读写。同样,机器也发现它易于解析和生成。对于任何 Python 开发人员来说,在处理来自 API、配置文件或其他存储信息源的数据时,JSON 解析都极为重要。本文将向您介绍使用 Python 的 JSON 模块解析 JSON 的基本步骤。

了解 JSON 及其结构

JSON 以键值对的形式表示数据,类似于 Python 字典。下面是一个 JSON 对象的基本示例:

{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"]
}

这个 JSON 对象包括一个字符串、一个数字、一个布尔值和一个数组。了解这种结构是在 Python 中解析和操作 JSON 数据的基础。

在 Python 中处理 JSON

Python 的 json 模块使解析 JSON 字符串和文件变得简单。该模块包括 json.loads() 和 json.load() 等方法,前者用于从字符串中读取 JSON,后者用于从文件中读取 JSON。相反,json.dumps() 和 json.dump() 则分别用于将 JSON 写入字符串和文件。

读取 JSON 数据

有几种读取 JSON 数据的方法,我们将在下文中介绍。

从字符串读取 JSON

要从字符串中读取 JSON 数据,请使用 json.loads() 方法:

import json

json_string = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
data = json.loads(json_string)

print(data)

输出:

1.png

从文件读取 JSON

要从文件中读取 JSON 数据,请使用 json.load() 方法:

import json

with open('data.json', 'r') as file:
    data = json.load(file)

print(data)

输出:

2.png

编写 JSON 数据

以下是一些写入 JSON 数据的不同方法:

将 JSON 写入字符串

要将 JSON 数据写入字符串,请使用 json.dumps() 方法:

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

json_string = json.dumps(data)
print(json_string)

输出:

3.png

将 JSON 写入文件

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

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

with open('data.json', 'w') as file:
    json.dump(data, file)

处理嵌套 JSON

在处理更复杂的数据结构时,嵌套 JSON 对象很常见。Python 可以轻松处理这些嵌套结构。

import json

nested_json_string = '''
{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"],
    "address": {
        "street": "123 Main St",
        "city": "Wonderland"
    }
}
'''

data = json.loads(nested_json_string)
print(data['address']['city'])

输出:

4.png

自定义 JSON 编码器

有时,您需要将自定义 Python 对象转换为 JSON。这就需要自定义编码器。

import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

class StudentEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Student):
            return obj.__dict__
        return super().default(obj)

student = Student("Alice", 30, False)
json_string = json.dumps(student, cls=StudentEncoder)
print(json_string)

输出:

5.png

自定义 JSON 解码器

同样,要将 JSON 数据解码为自定义 Python 对象,也需要一个自定义解码器。

import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

def student_decoder(dct):
    return Student(dct['name'], dct['age'], dct['is_student'])

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
student = json.loads(json_string, object_hook=student_decoder)
print(student.name)

输出:

6.png

处理常见问题

使用 JSON 数据可能会导致一些常见错误,尤其是在解析、生成或访问 JSON 数据时。以下是一些最常见的错误:

无效的 JSON 格式

解析 JSON 时常见的错误是遇到无效的 JSON 格式。JSON 要求在键和字符串值周围使用双引号,并正确嵌套括号和大括号。

import json

invalid_json_string = "{'name': 'Alice', 'age': 30, 'is_student': False}"
try:
    data = json.loads(invalid_json_string)
except json.JSONDecodeError as e:
    print(f"Invalid JSON format: {e}")

输出:

7.png

处理丢失的按键

解析 JSON 数据时,您可能会遇到键丢失的情况。如果键丢失,请使用 get 方法提供默认值。

import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)

调试 JSON 解析问题

使用 pdb 模块设置断点并调试 JSON 解析代码。

import json
import pdb

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
pdb.set_trace()
data = json.loads(json_string)
print(data)

网络刮削中 JSON 处理的实用示例

网络搜刮通常涉及从返回 JSON 响应的网络 API 中提取数据。下面是一个使用请求库和 https://httpbin.org/anything 端点的简洁示例。

首先,确保您已安装 requests 库:

pip install requests

这段代码导入了用于 HTTP 请求的 requests 和用于处理 JSON 数据的 json。它使用 requests.get(url) 向目标 URL 发送 GET 请求,并使用 response.json() 解析 JSON 响应,将其转化为 Python 字典。我们提取并打印特定的数据,如标题、用户代理、起源和 URL。

该代码包含强大的错误处理功能;当出现 JSON 解码错误时,它会捕获 json.JSONDecodeError,当缺少特定键时,它会捕获 KeyError,从而使程序免受 "无数据 "崩溃的影响。这种代码的健壮性使它能够完美地处理实际的网络刮擦任务。

import requests
import json

url = 'https://httpbin.org/anything'

response = requests.get(url)

try:
    data = response.json()

    # 从 JSON 响应中提取特定数据
    headers = data['headers']
    user_agent = headers.get('User-Agent', 'N/A')
    origin = data.get('origin', 'N/A')
    url = data.get('url', 'N/A')

    print(f"User Agent: {user_agent}")
    print(f"Origin: {origin}")
    print(f"URL: {url}")

except json.JSONDecodeError:
    print("Error decoding JSON response")

except KeyError as e:
    print(f"Key error: {e} not found in the JSON response")

8.png

每个 Python 程序员都必须知道如何解析 JSON。有了 JSON 模块和本手册中强调的最佳方法,您将能够快速读取、写入和调试 JSON 数据。这意味着您将定期测试代码,并使用正确的工具和 Python 中可用的最新功能来提高 JSON 处理技能。

此外,如果您能很好地解析和处理 JSON 数据,您就能高效地从各种网络资源中提取信息。

评论:

0 评论