JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,Python 的 json 模块提供了 JSON 数据的编码和解码功能。

基本用法

1. 导入模块

import json

2. JSON 编码(Python对象 → JSON字符串)

# Python 数据类型
data = {
    "name": "张三",
    "age": 25,
    "is_student": False,
    "hobbies": ["读书", "游泳", "编程"],
    "address": {
        "city": "北京",
        "zipcode": "100000"
    }
}

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

输出:

{
    "name": "张三",
    "age": 25,
    "is_student": false,
    "hobbies": [
        "读书",
        "游泳",
        "编程"
    ],
    "address": {
        "city": "北京",
        "zipcode": "100000"
    }
}

3. JSON 解码(JSON字符串 → Python对象)

# JSON 字符串
json_data = '{"name": "李四", "age": 30, "city": "上海"}'

# 转换为 Python 字典
python_dict = json.loads(json_data)
print(python_dict)
print(type(python_dict))

输出:

{'name': '李四', 'age': 30, 'city': '上海'}
<class 'dict'>

文件操作

写入 JSON 文件

data = {
    "name": "王五",
    "age": 28,
    "email": "wangwu@example.com"
}

# 写入文件
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

读取 JSON 文件

# 从文件读取
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)
    print(data)

常用参数说明

json.dumps() 参数

  • ensure_ascii: 是否确保ASCII编码(设为False可正确显示中文)
  • indent: 缩进空格数,用于美化输出
  • sort_keys: 是否按键排序
  • separators: 分隔符设置

json.loads() 参数

  • parse_float: 指定浮点数解析函数
  • parse_int: 指定整数解析函数
  • parse_constant: 指定常量解析函数

高级用法

自定义对象序列化

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

# 自定义序列化函数
def user_encoder(obj):
    if isinstance(obj, User):
        return {'name': obj.name, 'age': obj.age, '__class__': 'User'}
    raise TypeError(f'Object of type {obj.__class__.__name__} is not JSON serializable')

# 自定义反序列化函数
def user_decoder(dct):
    if '__class__' in dct and dct['__class__'] == 'User':
        return User(dct['name'], dct['age'])
    return dct

# 使用自定义编码器
user = User("赵六", 35)
json_str = json.dumps(user, default=user_encoder, ensure_ascii=False)
print(json_str)

# 使用自定义解码器
user_obj = json.loads(json_str, object_hook=user_decoder)
print(type(user_obj), user_obj.name, user_obj.age)

处理日期时间

from datetime import datetime

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

def datetime_decoder(dct):
    for key, value in dct.items():
        if isinstance(value, str):
            try:
                dct[key] = datetime.fromisoformat(value)
            except:
                pass
    return dct

data = {
    "event": "会议",
    "time": datetime.now()
}

json_str = json.dumps(data, default=datetime_encoder, ensure_ascii=False)
print(json_str)

data_restored = json.loads(json_str, object_hook=datetime_decoder)
print(data_restored)

错误处理

# 处理 JSON 解析错误
invalid_json = '{name: "测试", age: 25}'  # 缺少引号

try:
    data = json.loads(invalid_json)
except json.JSONDecodeError as e:
    print(f"JSON 解析错误: {e}")
    print(f"错误位置: 第{e.lineno}行, 第{e.colno}列")

性能优化

对于大型 JSON 数据,可以使用 ijson 库进行流式处理:

# 安装: pip install ijson
import ijson

# 流式处理大型 JSON 文件
with open('large_file.json', 'r') as f:
    parser = ijson.parse(f)
    for prefix, event, value in parser:
        print(f"prefix: {prefix}, event: {event}, value: {value}")

总结

Python 的 json 模块提供了:

  1. 简单易用的 JSON 编码解码功能
  2. 支持文件读写操作
  3. 丰富的参数配置
  4. 支持自定义对象的序列化
  5. 良好的错误处理机制

对于大多数应用场景,json 模块都能提供稳定可靠的数据交换解决方案。