Python中如何使用json模块解析字典(及序列化)**
在Python编程中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读易写而被广泛应用,Python内置了json模块,使得开发者能够轻松地在Python字典(dict)和JSON格式字符串之间进行转换,本文将详细介绍如何使用Python的json模块来解析JSON字符串为字典,以及如何将字典转换为JSON字符串(序列化)。
JSON与Python字典的对应关系
在学习之前,了解JSON数据类型与Python数据类型之间的对应关系非常重要:
| JSON 类型 | Python 类型 |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int) | int |
| number (real) | float |
| true | True |
| false | False |
| null | None |
解析JSON字符串为字典(json.loads())
当我们有一个符合JSON格式的字符串,并希望将其转换为Python字典时,可以使用json.loads()方法(loads表示load from string)。
语法:
import json python_dict = json.loads(json_string)
示例: 假设我们有一个JSON格式的用户信息字符串:
import json
json_str = '''
{
"name": "张三",
"age": 30,
"is_student": false,
"courses": ["Python", "JavaScript", "SQL"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
'''
# 使用json.loads()将JSON字符串解析为Python字典
user_dict = json.loads(json_str)
# 现在user_dict就是一个Python字典,我们可以像操作普通字典一样操作它
print("用户姓名:", user_dict["name"])
print("用户年龄:", user_dict["age"])
print("是否为学生:", user_dict["is_student"])
print("课程列表:", user_dict["courses"])
print("所在城市:", user_dict["address"]["city"])
print("整个字典:", user_dict)
输出:
用户姓名: 张三
用户年龄: 30
是否为学生: False
课程列表: ['Python', 'JavaScript', 'SQL']
所在城市: 北京
整个字典: {'name': '张三', 'age': 30, 'is_student': False, 'courses': ['Python', 'JavaScript', 'SQL'], 'address': {'city': '北京', 'district': '海淀区'}}
注意事项:
json.loads()的输入参数必须是字符串类型,如果传入的是字节串(bytes),需要先解码为字符串,或者使用json.load()(见下文)。- JSON字符串中的键必须用双引号()括起来,Python字典中的单引号()在JSON中是不合法的。
- 如果JSON字符串格式不正确(例如括号不匹配、键没有引号等),
json.loads()会抛出json.JSONDecodeError异常。
从文件中加载JSON数据并解析为字典(json.load())
如果我们需要从文件中读取JSON数据并将其解析为Python字典,可以使用json.load()方法(load表示从文件类对象加载)。
语法:
import json
with open('data.json', 'r', encoding='utf-8') as f:
python_dict = json.load(f)
示例:
假设我们有一个名为data.json的文件,内容如下:
{
"id": 101,
"product": "笔记本电脑",
"price": 5999.00,
"in_stock": true
}
我们可以用以下Python代码读取并解析它:
import json
try:
with open('data.json', 'r', encoding='utf-8') as f:
product_dict = json.load(f)
print("产品ID:", product_dict["id"])
print("产品名称:", product_dict["product"])
print("产品价格:", product_dict["price"])
print("是否有货:", product_dict["in_stock"])
except FileNotFoundError:
print("错误:文件未找到!")
except json.JSONDecodeError:
print("错误:JSON文件格式不正确!")
输出:
产品ID: 101
产品名称: 笔记本电脑
产品价格: 5999.0
是否有货: True
字典转换为JSON字符串(json.dumps())
当我们需要将Python字典转换为JSON字符串以便存储或传输时,可以使用json.dumps()方法(dumps表示dump to string)。
语法:
import json json_string = json.dumps(python_dict, ensure_ascii=False, indent=4)
常用参数:
ensure_ascii=False:默认情况下,json.dumps()会将所有非ASCII字符转义为\uXXXX形式,设置为False可以保留原始的中文字符等,使输出更易读。indent=4:指定缩进空格数,使输出的JSON字符串格式化,提高可读性,如果不设置,则输出为一行紧凑格式。
示例:
import json
user_info = {
"name": "李四",
"age": 25,
"skills": ["Python", "Django", "PostgreSQL"],
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
}
}
# 转换为JSON字符串(紧凑格式)
json_str_compact = json.dumps(user_info)
print("紧凑格式JSON:")
print(json_str_compact)
# 转换为格式化的JSON字符串(保留中文,缩进4空格)
json_str_pretty = json.dumps(user_info, ensure_ascii=False, indent=4)
print("\n格式化JSON:")
print(json_str_pretty)
输出:
紧凑格式JSON:
{"name": "\u674e\u56db", "age": 25, "skills": ["Python", "Django", "PostgreSQL"], "contact": {"email": "lisi@example.com", "phone": "13800138000"}}
格式化JSON:
{
"name": "李四",
"age": 25,
"skills": [
"Python",
"Django",
"PostgreSQL"
],
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
}
}
将字典保存为JSON文件(json.dump())
如果我们需要将Python字典直接写入到一个JSON文件中,可以使用json.dump()方法。
语法:
import json
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(python_dict, f, ensure_ascii=False, indent=4)
示例:
将上面的user_info字典保存到user_info.json文件中:
import json
user_info = {
"name": "王五",
"age": 28,
"department": "研发部",
"join_date": "2022-03-15"
}
try:
with open('user_info.json', 'w', encoding='utf-8') as f:
json.dump(user_info, f, ensure_ascii=False, indent=4)
print("字典已成功保存到user_info.json文件。")
except Exception as e:
print(f"保存文件时发生错误: {e}")
执行后,会生成一个user_info.json如下:
{
"name": "王五",
"age": 28,
"department": "研发部",
"join_date": "2022-03-15"
}
常见问题与解决
-
json.JSONDecodeError: Invalid control character at:- 原因:JSON字符串中包含了不允许的控制字符(如
\n,\t等,除非它们被转义)。 - 解决:在解析前,对字符串进行处理,移除或转义这些控制字符,可以使用
json_str.replace('\n', '\\n')等方式(但需谨慎处理所有非法字符)。
- 原因:JSON字符串中包含了不允许的控制字符(如
-
TypeError: the JSON object must be str, bytes or bytearray, not 'dict':- 原因:错误地使用
json.loads()解析了一个已经是字典的对象,或者json.load()时传入的不是文件类对象。 - 解决:确认传入
json.loads()的是字符串,传入json.load()的是打开的文件对象。
- 原因:错误地使用
-
中文显示为Unicode转义序列(如
\u674e\u56db):- 原因:
json.dumps()默认ensure_ascii=True。 - 解决:在
json.dumps()或json.dump()时设置ensure_ascii=False。
- 原因:
Python的`json



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