JSON模块基础与实战

JSON模块基础与实战

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于客户端和服务器之间的数据传输。Python 提供了 json 模块来处理 JSON 数据,允许你轻松地将 Python 对象转换为 JSON 格式,反之亦然。下面将总结 json 模块的基础知识,并通过一些实战代码示例来加深理解。

1. json 模块基础

json 模块提供了两个核心功能:

  • 序列化(将 Python 对象转换为 JSON 格式)
  • 反序列化(将 JSON 字符串转换为 Python 对象)
主要函数:
  • json.dump(obj, fp): 将 Python 对象 obj 写入文件对象 fp 中(即序列化)。
  • json.dumps(obj): 将 Python 对象 obj 转换为 JSON 字符串(即序列化)。
  • json.load(fp): 从文件对象 fp 中读取并反序列化 JSON 数据为 Python 对象。
  • json.loads(s): 将 JSON 字符串 s 反序列化为 Python 对象。

2. 常见的 JSON 数据类型

  • 对象(Object):在 Python 中对应 dict 类型
  • 数组(Array):在 Python 中对应 list 类型
  • 字符串(String):在 Python 中对应 str 类型
  • 数字(Number):在 Python 中对应 intfloat 类型
  • 布尔值(Boolean):在 Python 中对应 bool 类型
  • 空值(Null):在 Python 中对应 None 类型

3. JSON 序列化(json.dumpjson.dumps

json.dump

将 Python 对象写入到文件中的 JSON 格式。可以指定额外的参数如 indent 来格式化输出。

import json

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

# 将数据写入文件
with open("data.json", "w") as f:
    json.dump(data, f, indent=4)
json.dumps

将 Python 对象转换为 JSON 字符串。

import json

data = {
    "name": "Bob",
    "age": 25,
    "is_student": True
}

# 将数据转换为 JSON 字符串
json_str = json.dumps(data, indent=4)
print(json_str)

4. JSON 反序列化(json.loadjson.loads

json.load

从文件中读取 JSON 数据并转换为 Python 对象。

import json

# 从文件中读取 JSON 数据
with open("data.json", "r") as f:
    data = json.load(f)

print(data)
json.loads

将 JSON 字符串反序列化为 Python 对象。

import json

json_str = '{"name": "Charlie", "age": 22, "is_student": true}'

# 将 JSON 字符串转换为 Python 对象
data = json.loads(json_str)
print(data)

5. 处理复杂数据类型

JSON 仅支持以下数据类型:dict, list, str, int, float, bool, None。如果 Python 对象包含其他类型,默认会抛出 TypeError 异常。可以通过指定 default 参数来处理自定义类型。

示例:处理自定义对象

假设你有一个 Python 类 Person,需要将其转换为 JSON 格式:

import json

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

    def to_dict(self):
        return {"name": self.name, "age": self.age}

# 创建一个 Person 对象
person = Person("David", 40)

# 定义一个自定义的 JSON 序列化函数
def person_serializer(obj):
    if isinstance(obj, Person):
        return obj.to_dict()
    raise TypeError(f"Type {type(obj)} not serializable")

# 将 Person 对象序列化为 JSON 字符串
json_str = json.dumps(person, default=person_serializer)
print(json_str)

6. 其他选项

  • indent:指定格式化输出的缩进层级,使输出更加美观。
  • separators:定义分隔符,默认情况下 JSON 中键和值之间有一个空格,可以调整为没有空格。
  • sort_keys:指定是否按键排序输出。
import json

data = {"name": "Alice", "age": 30, "city": "New York"}

# 设置序列化选项
json_str = json.dumps(data, indent=2, separators=(",", ": "), sort_keys=True)
print(json_str)

7. 错误处理

使用 json 时,可能会遇到 JSON 编码或解码错误。常见的错误有:

  • JSONDecodeError:当输入的 JSON 数据格式不正确时抛出。
  • TypeError:当 Python 对象不能被序列化为 JSON 时抛出。

例如,无法序列化 set 类型的对象:

import json

# 尝试序列化 set 类型数据
data = {1, 2, 3}

try:
    json_str = json.dumps(data)
except TypeError as e:
    print(f"Error: {e}")

8. 实战示例:API 请求和响应处理

假设你需要处理从 REST API 获取的 JSON 数据。你可以用 requests 库(在实际环境中)来获取数据,并用 json 模块进行解析。

import requests
import json

# 假设从 API 获取 JSON 响应
response = requests.get("https://jsonplaceholder.typicode.com/posts")

# 解析 JSON 响应
data = response.json()  # 自动调用 json.loads
print(json.dumps(data, indent=4))  # 美化输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘忧记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值