JSON库文件怎么用:从基础到实践的全面指南
在Python开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读、易解析的特性,被广泛应用于API接口、配置文件、数据存储等场景,Python内置了json库文件,无需额外安装即可直接使用,本文将详细介绍json库的核心功能、使用方法及常见应用场景,帮助您快速JSON数据的处理技巧。
初识JSON:为什么需要json库?
JSON是一种基于文本的数据格式,采用键值对(Key-Value)的结构组织数据,类似于Python中的字典(dict)和列表(list)。
{
"name": "张三",
"age": 25,
"is_student": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
Python的json库主要解决两类问题:
- 序列化:将Python对象(如字典、列表)转换为JSON格式的字符串,便于存储或传输;
- 反序列化:将JSON格式的字符串解析为Python对象,方便程序处理。
核心功能:json库的四大方法
json库提供了4个核心方法,分别对应不同场景的序列化和反序列化需求:
json.dumps():Python对象 → JSON字符串(序列化)
dumps()(dump string)用于将Python对象转换为JSON格式的字符串。
语法:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
常用参数:
indent:指定缩进空格数,使JSON字符串格式化(便于阅读),默认为None(不换行);ensure_ascii:是否将非ASCII字符(如中文)转义为\u编码,默认为True(转义);设为False时可保留原字符;sort_keys:是否对字典的键进行排序,默认为False(不排序)。
示例:
import json
# Python字典
data = {
"name": "李四",
"age": 30,
"hobbies": ["阅读", "游泳"],
"info": {"city": "上海", "salary": 15000}
}
# 序列化为JSON字符串(默认不格式化)
json_str = json.dumps(data)
print("默认序列化:", json_str)
# 输出:默认序列化: {"name": "李四", "age": 30, "hobbies": ["阅读", "游泳"], "info": {"city": "上海", "salary": 15000}}
# 序列化并格式化(缩进4空格,保留中文)
json_str_formatted = json.dumps(data, indent=4, ensure_ascii=False)
print("格式化序列化:\n", json_str_formatted)
# 输出:
# 格式化序列化:
# {
# "name": "李四",
# "age": 30,
# "hobbies": [
# "阅读",
# "游泳"
# ],
# "info": {
# "city": "上海",
# "salary": 15000
# }
# }
json.loads():JSON字符串 → Python对象(反序列化)
loads()(load string)用于将JSON格式的字符串解析为Python对象(字典、列表等)。
语法:
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
常用参数:
object_hook:指定一个函数,用于解析JSON中的字典时自定义处理(如将字典转为自定义类实例);parse_int:指定一个函数,用于解析JSON中的整数(如将大整数转为int或decimal.Decimal)。
示例:
import json
# JSON字符串
json_str = '{"name": "王五", "age": 28, "is_teacher": true, "courses": ["物理", "化学"]}'
# 反序列化为Python对象
python_obj = json.loads(json_str)
print("反序列化结果:", python_obj)
print("类型:", type(python_obj))
# 输出:
# 反序列化结果: {'name': '王五', 'age': 28, 'is_teacher': True, 'courses': ['物理', '化学']}
# 类型: <class 'dict'>
# 访问反序列化后的数据
print("姓名:", python_obj["name"]) # 输出:姓名: 王五
print("课程:", python_obj["courses"][0]) # 输出:课程: 物理
json.dump():Python对象 → JSON文件(序列化到文件)
dump()(dump)与dumps()功能类似,但直接将Python对象序列化后写入文件(无需手动拼接字符串),适合处理大量数据。
语法:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
参数说明:
fp:文件对象(需以写入模式打开,如open(file, "w", encoding="utf-8"));- 其他参数与
dumps()一致。
示例:
import json
# Python对象
data = {
"id": 1001,
"product": "笔记本电脑",
"price": 5999,
"tags": ["电子产品", "办公", "高性能"]
}
# 写入JSON文件(格式化,编码utf-8)
with open("product.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
print("数据已写入product.json文件")
执行后,当前目录会生成product.json为:
{
"id": 1001,
"product": "笔记本电脑",
"price": 5999,
"tags": [
"电子产品",
"办公",
"高性能"
]
}
json.load():JSON文件 → Python对象(从文件反序列化)
load()(load)与loads()功能类似,但直接从文件对象读取JSON数据并反序列化为Python对象,适合处理存储在文件中的JSON数据。
语法:
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
参数说明:
fp:文件对象(需以读取模式打开,如open(file, "r", encoding="utf-8"));- 其他参数与
loads()一致。
示例:
import json
# 从JSON文件读取数据
with open("product.json", "r", encoding="utf-8") as f:
product_data = json.load(f)
print("读取到的数据:", product_data)
print("产品名称:", product_data["product"])
# 输出:
# 读取到的数据: {'id': 1001, 'product': '笔记本电脑', 'price': 5999, 'tags': ['电子产品', '办公', '高性能']}
# 产品名称: 笔记本电脑
进阶技巧:处理复杂数据与自定义类型
Python的json库默认支持以下Python对象与JSON类型的转换:
| Python对象 | JSON类型 |
|---|---|
dict |
Object(对象) |
list |
Array(数组) |
str |
String(字符串) |
int/float |
Number(数字) |
True/False |
Boolean(布尔值) |
None |
null(空值) |
但遇到Python特有类型(如datetime、自定义类)时,直接序列化会报错(TypeError),此时可通过default参数或自定义编码器解决。
处理datetime类型
datetime对象无法直接序列化为JSON,需通过default参数将其转为字符串:
import json
from datetime import datetime
data = {
"name": "测试数据",
"create_time": datetime.now()
}
# 自定义序列化函数(处理datetime)
def datetime_handler(obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# 使用default参数传入自定义函数
json


还没有评论,来说两句吧...