pin_drop当前位置:知识文库 ❯ 图文

Python标准库json使用

一、json模块概述

json 是Python标准库中用于处理JSON数据的核心模块。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Web开发、API通信、配置文件等场景中,JSON是最常用的数据格式之一。

json模块提供了将Python对象转换为JSON字符串(序列化)以及将JSON字符串转换为Python对象(反序列化)的功能。它支持所有标准的JSON数据类型,包括对象、数组、字符串、数字、布尔值和null。


二、核心函数语法

1. 序列化函数

代码示例

import json

# dumps(): 将Python对象转换为JSON字符串
json_str = json.dumps(obj, ensure_ascii=True, indent=None, sort_keys=False)

# dump(): 将Python对象转换为JSON并写入文件
json.dump(obj, fp, ensure_ascii=True, indent=None, sort_keys=False)

2. 反序列化函数

代码示例

import json

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

# load(): 从文件读取JSON并转换为Python对象
python_obj = json.load(fp)

3. 常用参数说明

代码示例

# ensure_ascii: 是否转义非ASCII字符(默认True)
# indent: 缩进空格数,用于美化输出(默认None,紧凑格式)
# sort_keys: 是否按键名排序(默认False)
# separators: 分隔符元组 (item_separator, key_separator)
# default: 处理不可序列化对象的函数

三、基本用法详解

Python与JSON类型对应

代码示例

import json

# Python dict -> JSON object
data = {"name": "张三", "age": 25}
json_str = json.dumps(data)
print(json_str)  # {"name": "张三", "age": 25}

# Python list -> JSON array
data = [1, 2, 3, "四", "五"]
json_str = json.dumps(data)
print(json_str)  # [1, 2, 3, "四", "五"]

# Python str -> JSON string
data = "Hello, JSON"
json_str = json.dumps(data)
print(json_str)  # "Hello, JSON"

# Python int/float -> JSON number
data = 42
json_str = json.dumps(data)
print(json_str)  # 42

# Python True/False -> JSON true/false
data = True
json_str = json.dumps(data)
print(json_str)  # true

# Python None -> JSON null
data = None
json_str = json.dumps(data)
print(json_str)  # null

处理中文字符

代码示例

import json

data = {"姓名": "张三", "城市": "北京"}

# 默认情况:中文被转义为Unicode
json_str1 = json.dumps(data)
print(json_str1)  # {"\u59d3\u540d": "\u5f20\u4e09", ...}

# 设置ensure_ascii=False:保留中文
json_str2 = json.dumps(data, ensure_ascii=False)
print(json_str2)  # {"姓名": "张三", "城市": "北京"}

美化输出格式

代码示例

import json

data = {
    "name": "张三",
    "age": 25,
    "skills": ["Python", "JavaScript", "SQL"],
    "address": {
        "city": "北京",
        "district": "朝阳区"
    }
}

# 紧凑格式
json_compact = json.dumps(data, ensure_ascii=False)
print(json_compact)

# 美化格式(缩进2个空格)
json_pretty = json.dumps(data, ensure_ascii=False, indent=2)
print(json_pretty)

# 美化格式 + 键排序
json_sorted = json.dumps(data, ensure_ascii=False, indent=2, sort_keys=True)
print(json_sorted)

四、完整代码示例

示例1:JSON文件读写

代码示例

import json

# 写入JSON文件
data = {
    "users": [
        {"id": 1, "name": "张三", "age": 25},
        {"id": 2, "name": "李四", "age": 30},
        {"id": 3, "name": "王五", "age": 28}
    ],
    "total": 3
}

with open('users.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
print("JSON文件已保存")

# 读取JSON文件
with open('users.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)
    
print(f"用户总数:{loaded_data['total']}")
for user in loaded_data['users']:
    print(f"  {user['name']},{user['age']}岁")

示例2:处理自定义对象

代码示例

import json
from datetime import datetime

class User:
    def __init__(self, name, age, created_at=None):
        self.name = name
        self.age = age
        self.created_at = created_at or datetime.now()
    
    def to_dict(self):
        """将对象转换为字典"""
        return {
            'name': self.name,
            'age': self.age,
            'created_at': self.created_at.isoformat()
        }
    
    @classmethod
    def from_dict(cls, data):
        """从字典创建对象"""
        return cls(
            name=data['name'],
            age=data['age'],
            created_at=datetime.fromisoformat(data['created_at'])
        )

# 序列化自定义对象
user = User("张三", 25)
user_dict = user.to_dict()
json_str = json.dumps(user_dict, ensure_ascii=False, indent=2)
print("序列化:")
print(json_str)

# 反序列化为自定义对象
loaded_dict = json.loads(json_str)
loaded_user = User.from_dict(loaded_dict)
print(f"\n反序列化:{loaded_user.name},{loaded_user.age}岁")

示例3:使用default参数处理特殊类型

代码示例

import json
from datetime import datetime, date

def custom_serializer(obj):
    """自定义序列化函数"""
    if isinstance(obj, datetime):
        return obj.isoformat()
    elif isinstance(obj, date):
        return obj.strftime('%Y-%m-%d')
    elif isinstance(obj, set):
        return list(obj)
    else:
        raise TypeError(f"Type {type(obj)} not serializable")

# 包含特殊类型的数据
data = {
    "event": "会议",
    "datetime": datetime.now(),
    "date": date.today(),
    "tags": {"重要", "紧急", "工作"}
}

# 使用default参数
json_str = json.dumps(data, default=custom_serializer, ensure_ascii=False, indent=2)
print(json_str)

示例4:JSON数据验证与处理

代码示例

import json

def safe_load_json(json_str):
    """安全地加载JSON,处理可能的错误"""
    try:
        data = json.loads(json_str)
        return data, None
    except json.JSONDecodeError as e:
        return None, f"JSON解析错误:{e}"
    except Exception as e:
        return None, f"未知错误:{e}"

# 测试正常JSON
json_str1 = '{"name": "张三", "age": 25}'
data, error = safe_load_json(json_str1)
if error:
    print(f"错误:{error}")
else:
    print(f"成功:{data}")

# 测试错误JSON
json_str2 = '{"name": "张三", "age":}'  # 格式错误
data, error = safe_load_json(json_str2)
if error:
    print(f"错误:{error}")
else:
    print(f"成功:{data}")

五、注意事项与最佳实践

注意1:处理中文时,务必设置 ensure_ascii=False,否则中文会被转义为Unicode编码(如 \u5f20\u4e09),降低可读性。

注意2:json模块只能序列化基本数据类型(dict、list、str、int、float、bool、None)。对于自定义对象、datetime等类型,需要提供 default 函数或先转换为字典。

注意3:读写JSON文件时,务必指定 encoding='utf-8',避免在不同操作系统上出现编码问题。Windows系统默认使用GBK编码,可能导致中文乱码。

注意4:解析外部JSON数据时,始终使用 try-except 捕获 json.JSONDecodeError 异常,防止程序因格式错误而崩溃。

小贴士

如果需要处理更大的JSON数据或需要更高的性能,可以考虑使用第三方库 ujsonorjson,它们比标准库json快数倍。安装方式:pip install ujsonpip install orjson


六、课程小结

  • 序列化dumps() 将Python对象转为JSON字符串,dump() 写入文件

  • 反序列化loads() 从JSON字符串转为Python对象,load() 从文件读取

  • 中文处理:设置 ensure_ascii=False 保留中文字符

  • 美化输出:使用 indent 参数设置缩进,sort_keys=True 按键排序

  • 自定义类型:使用 default 参数处理不可序列化的类型


七、练习题

练习1

编写一个程序,创建一个包含学生信息的字典(姓名、年龄、成绩列表),将其序列化为JSON字符串并打印。然后反序列化该字符串,计算并输出平均成绩。

练习2

编写一个函数 save_config(config_dict, filename),将配置字典保存为JSON文件。再编写一个函数 load_config(filename) 读取配置文件,处理可能的文件不存在和JSON格式错误。

常见问题

json.dumps()和json.dump()有什么区别?

dumps() 返回JSON字符串,dump() 将JSON写入文件对象。类似地,loads() 从字符串解析,load() 从文件对象解析。带"s"的函数处理字符串,不带"s"的函数处理文件。

为什么中文会变成Unicode编码?

默认情况下,ensure_ascii=True 会将非ASCII字符转义为 \uXXXX 格式,确保输出是纯ASCII。设置 ensure_ascii=False 可以保留中文字符。

如何序列化datetime对象?

json模块不能直接序列化datetime对象。解决方法:① 使用 default 参数提供自定义序列化函数;② 先将datetime转为ISO格式字符串 dt.isoformat();③ 使用第三方库如 simplejson

JSON和Python字典有什么区别?

JSON是字符串格式,Python字典是内存中的对象。JSON的键必须是字符串,Python字典的键可以是任何不可变类型。JSON支持的数据类型更少(没有元组、集合等)。JSON是跨语言的数据交换格式,Python字典是Python特有的数据结构。

如何处理JSON解析错误?

使用 try-except 捕获 json.JSONDecodeError 异常。例如:try: data = json.loads(s) except json.JSONDecodeError as e: print(f"解析错误:{e}")。错误信息会包含具体的错误位置和原因。

标签: Python json JSON序列化 标准库 数据格式 中文处理 文件读写

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python标准库datetime使用 下一篇: Python标准库re:正则表达式完全指南

poll相关推荐