从零开始:Python中JSON库的完全使用指南
在现代编程中,数据交换是至关重要的一环,JSON(JavaScript Object Notation)作为一种轻量级、易读、易解析的数据格式,已经成为Web开发、API通信以及配置文件存储的事实标准,Python内置了强大的 json 库,让我们能够轻松地在Python数据类型和JSON格式之间进行转换,本文将带你从零开始,全面Python中json库的使用方法。
什么是JSON?为什么我们需要它?
在开始之前,我们先简单了解一下JSON。
JSON(JavaScript Object Notation)是一种基于文本的数据格式,它结构清晰,易于人类阅读和编写,也易于机器解析和生成,它类似于Python中的字典和列表,但语法更严格。
一个典型的JSON数据长这样:
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": [
{"title": "数学", "credits": 4},
{"title": "物理", "credits": 3}
],
"address": null
}
我们可以看到,JSON支持:
- 键值对:类似Python字典,键必须是字符串,值可以是多种类型。
- 数组:类似Python列表,用于存储有序的值集合。
- 数据类型:字符串、数字、布尔值(
true/false)、null(类似Python的None)。
json库的核心功能就是充当Python对象和JSON字符串之间的“翻译官”。
核心功能:Python对象与JSON字符串的转换
json库提供了四个核心函数,处理两种方向的转换:
- Python对象 -> JSON字符串 (序列化/Serialization)
- JSON字符串 -> Python对象 (反序列化/Deserialization)
第一部分:将Python对象转换为JSON字符串(序列化)
这个过程也称为“编码”(Encoding),我们使用 json.dumps() 函数(dumps代表 "dump string")。
*`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)`**
最常用的参数是 indent,它能让JSON字符串格式化输出,非常美观。
示例代码:
import json
# 1. 准备一个Python字典
python_data = {
"name": "李四",
"age": 25,
"skills": ["Python", "Java", "Go"],
"contact": {
"email": "lisi@example.com",
"phone": "138-8888-8888"
}
}
# 2. 使用 dumps() 将Python字典转换为JSON字符串
# 默认情况下,dumps() 返回一个紧凑的、没有缩进的字符串
json_string_compact = json.dumps(python_data)
print("紧凑格式的JSON字符串:")
print(json_string_compact)
# 输出: {"name": "李四", "age": 25, "skills": ["Python", "Java", "Go"], "contact": {"email": "lisi@example.com", "phone": "138-8888-8888"}}
# 3. 使用 indent 参数美化输出,使其更易读
json_string_pretty = json.dumps(python_data, indent=4, ensure_ascii=False)
print("\n美化格式的JSON字符串:")
print(json_string_pretty)
# ensure_ascii=False 确保中文字符能正常显示,而不是被转义为 \uXXXX
输出结果:
紧凑格式的JSON字符串:
{"name": "李四", "age": 25, "skills": ["Python", "Java", "Go"], "contact": {"email": "lisi@example.com", "phone": "138-8888-8888"}}
美化格式的JSON字符串:
{
"name": "李四",
"age": 25,
"skills": [
"Python",
"Java",
"Go"
],
"contact": {
"email": "lisi@example.com",
"phone": "138-8888-8888"
}
}
支持的Python对象类型:
dict->objectlist,tuple->arraystr->stringint,float->numberTrue->trueFalse->falseNone->null
如果Python对象包含上述类型之外的类型(datetime 对象),dumps() 会抛出 TypeError,这时,你可以使用 default 参数自定义转换逻辑。
第二部分:将JSON字符串转换为Python对象(反序列化)
这个过程也称为“解码”(Decoding),我们使用 json.loads() 函数(loads代表 "load string")。
*`json.loads(s, , cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw)`
示例代码:
import json
# 1. 准备一个JSON格式的字符串
json_string = """
{
"name": "王五",
"age": 28,
"isEmployed": true,
"hobbies": ["游泳", "阅读"]
}
"""
# 2. 使用 loads() 将JSON字符串转换为Python字典
python_dict = json.loads(json_string)
# 3. 现在你可以像操作普通Python字典一样操作它
print("转换后的Python对象类型:", type(python_dict))
print("姓名:", python_dict["name"])
print("爱好:", python_dict["hobbies"][0])
输出结果:
转换后的Python对象类型: <class 'dict'>
姓名: 王五
爱好: 游泳
转换后的Python对象类型:
object->dictarray->liststring->strnumber(int) ->intnumber(real) ->floattrue->Truefalse->Falsenull->None
文件操作:读写JSON文件
在实际开发中,我们更常需要将数据保存到文件或从文件中读取。json库为此提供了两个更方便的函数:json.dump() 和 json.load()。
*`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)`
将Python对象写入文件类对象(如 open() 打开的文件)。
*`json.load(fp, , cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw)` 从文件类对象中读取JSON数据并转换为Python对象。
示例代码:
import json
# --- 写入JSON到文件 ---
data_to_save = {
"product": "超级智能手机",
"price": 5999,
"in_stock": True
}
# 使用 with 语句打开文件,确保文件会被正确关闭
# 使用 'w' 模式(写入)和 ensure_ascii=False, indent=4 来美化文件内容
with open('product.json', 'w', encoding='utf-8') as f:
json.dump(data_to_save, f, indent=4, ensure_ascii=False)
print("数据已成功写入 product.json 文件。")
# --- 从文件中读取JSON ---
# 使用 'r' 模式(读取)
with open('product.json', 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
print("\n从文件中读取的数据:")
print(loaded_data)
print("产品价格:", loaded_data["price"])
生成的 product.json 文件内容:
{
"product": "超级智能手机",
"price": 5999,
"in_stock": true
}
输出结果:
数据已成功写入 product.json 文件。
从文件中读取的数据:
{'product': '超级智能手机', 'price': 5999, 'in_stock': True}
产品价格: 5999
高级用法与最佳实践
-
处理自定义对象 默认情况下,
json库无法序列化自定义类的实例,如果你想把一个对象转为JSON,你需要实现一个转换函数,并将其传给dumps()的default参数。import json from datetime import datetime class User: def __init__(self, name, created_at): self.name = name self.created_at = created_at # 这是一个 datetime 对象 # 自定义转换函数 def user_serializer(obj): if isinstance(obj, User): return { 'name': obj.name, '



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