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数据或需要更高的性能,可以考虑使用第三方库 ujson 或 orjson,它们比标准库json快数倍。安装方式:pip install ujson 或 pip 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}")。错误信息会包含具体的错误位置和原因。
本文涉及AI创作
内容由AI创作,请仔细甄别