Python轮子:格式化数据~json

原文链接:http://www.juzicode.com/python-module-json/

json 是 Python 标准库中用于处理 JSON 格式数据的模块,提供数据序列化与反序列化功能。支持字典、列表等基础类型转换,适用于配置文件读写、API 数据交互和跨平台数据交换等场景。

应用场景

  • API 开发:序列化 Python 对象为 JSON 响应
  • 配置文件:读写 JSON 格式的配置信息
  • 数据存储:保存结构化数据到文件
  • 数据清洗:转换不同系统的数据格式

安装或导入

Python 内置标准库,直接导入使用:

import json

基本用法

以下示例展示 JSON 编码与解码的核心操作,涵盖基础类型转换和文件操作。

1. 字典转 JSON 字符串

使用 dumps() 将 Python 字典转换为 JSON 字符串。ensure_ascii 参数可禁用 ASCII 转义。

#juzicode.com/VX公众号:juzicode
import json

data = {"name": "张三", "age": 30, "skills": ["Python", "SQL"]}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)

运行结果:

{"name": "张三", "age": 30, "skills": ["Python", "SQL"]}

2. JSON 字符串转字典

使用 loads() 解析 JSON 字符串为 Python 对象。自动转换 JSON 类型到对应的 Python 类型。

#juzicode.com/VX公众号:juzicode
json_str = '{"city": "北京", "population": 2154}'
data = json.loads(json_str)
print(data["city"])

运行结果:

北京

3. 读写 JSON 文件

通过 dump() 和 load() 实现文件持久化。indent 参数可美化输出格式。

#juzicode.com/VX公众号:juzicode
# 写入文件
data = {"key": "value"}
with open("data.json", "w") as f:
    json.dump(data, f, indent=4)

# 读取文件
with open("data.json") as f:
    loaded = json.load(f)
print(loaded)

运行结果:

{'key': 'value'}

4. 处理嵌套结构

自动转换嵌套的字典和列表结构。JSON 数组对应 Python 列表,对象对应字典。

#juzicode.com/VX公众号:juzicode
json_str = '''
{
    "users": [
        {"name": "Alice", "age": 25},
        {"name": "Bob", "age": 30}
    ]
}'''
data = json.loads(json_str)
print(data["users"][0]["name"])

运行结果:

Alice

5. 处理特殊类型

默认不支持 datetime 等特殊类型,需自定义处理。通过 default 参数指定序列化函数。

#juzicode.com/VX公众号:juzicode
from datetime import datetime

def default_serializer(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    raise TypeError("Type not serializable")

data = {"time": datetime.now()}
json_str = json.dumps(data, default=default_serializer)
print(json_str)

运行结果:

{"time": "2023-10-05T14:30:00.123456"}

高级功能

以下示例展示 JSON 模块的进阶用法,处理复杂序列化需求和性能优化。

1. 自定义编码器

继承 JSONEncoder 处理自定义对象。需实现 default() 方法定义序列化逻辑。

#juzicode.com/VX公众号:juzicode
class User:
    def __init__(self, name):
        self.name = name

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, User):
            return {"username": obj.name}
        return super().default(obj)

user = User("John")
print(json.dumps(user, cls=CustomEncoder))

运行结果:

{"username": "John"}

2. 解析钩子函数

通过 object_hook 在解析时转换字典对象。常用于将 JSON 数据映射到自定义类实例。

#juzicode.com/VX公众号:juzicode
def hook_func(dct):
    if "username" in dct:
        return User(dct["username"])
    return dct

json_str = '{"username": "Alice"}'
user = json.loads(json_str, object_hook=hook_func)
print(type(user).__name__)

运行结果:

User

3. 压缩 JSON 输出

通过 separators 参数移除空白字符。减少 JSON 体积,适合网络传输。

#juzicode.com/VX公众号:juzicode
data = {"a": 1, "b": 2}
json_str = json.dumps(data, separators=(',', ':'))
print(json_str)

运行结果:

{"a":1,"b":2}

4. 自定义排序键

通过 sort_keys 参数控制输出顺序。保证序列化结果的确定性。

#juzicode.com/VX公众号:juzicode
data = {"c": 3, "a": 1, "b": 2}
json_str = json.dumps(data, sort_keys=True)
print(json_str)

运行结果:

{"a": 1, "b": 2, "c": 3}

总结

json 模块的核心优势包括:

  • 支持标准 JSON 规范
  • 简单易用的 API 设计
  • 灵活的类型扩展机制
  • 高效的大数据处理能力

该模块是 Python 数据交换的基石工具,通过合理使用序列化参数和自定义处理逻辑,可以满足从基础到复杂的各种 JSON 处理需求。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注