在Python中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python内置的json
模块提供了简单易用的方法来实现数据的序列化和反序列化。下面将详细介绍如何在Python中进行JSON数据的序列化和反序列化,并给出具体的示例。
1. 序列化
序列化是指将Python对象转换为JSON格式的字符串。json
模块提供了两个主要的方法来实现这一过程:
- 「
json.dumps()
」: 将Python对象转换为JSON格式的字符串。 - 「
json.dump()
」: 将Python对象序列化为JSON格式并写入文件。
示例1:使用json.dumps()
import json
# 定义一个Python字典
data = {
"name": "张三",
"age": 30,
"is_employee": True,
"skills": ["Python", "Java", "C++"]
}
# 将字典转换为JSON格式的字符串
json_data = json.dumps(data, ensure_ascii=False, indent=4)
print(json_data)
「输出结果:」
{
"name": "张三",
"age": 30,
"is_employee": true,
"skills": [
"Python",
"Java",
"C++"
]
}
「解释:」
ensure_ascii=False
:确保中文字符不被转义为Unicode编码。indent=4
:设置输出格式的缩进,使JSON字符串更易读。
示例2:使用json.dump()
import json
# 定义一个Python字典
data = {
"name": "李四",
"age": 25,
"is_employee": False,
"skills": ["JavaScript", "HTML", "CSS"]
}
# 将字典序列化为JSON格式并写入文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
「解释:」
with open('data.json', 'w', encoding='utf-8') as f
: 以写模式打开文件,并指定编码为UTF-8。json.dump(data, f, ensure_ascii=False, indent=4)
: 将字典序列化为JSON格式并写入文件。
2. 反序列化
反序列化是指将JSON格式的字符串转换回Python数据对象。json
模块提供了两个主要的方法来实现这一过程:
- 「
json.loads()
」: 将JSON格式的字符串解码为Python对象。 - 「
json.load()
」: 从文件中读取JSON字符串并将其解码为Python对象。
示例3:使用json.loads()
import json
# 定义一个JSON格式的字符串
json_data = '{"name": "王五", "age": 28, "is_employee": true, "skills": ["Go", "Rust"]}'
# 将JSON字符串转换为Python字典
data = json.loads(json_data)
print(data)
print(type(data))
「输出结果:」
{'name': '王五', 'age': 28, 'is_employee': True, 'skills': ['Go', 'Rust']}
<class 'dict'>
「解释:」
json.loads(json_data)
: 将JSON字符串解码为Python对象。
示例4:使用json.load()
import json
# 从文件中读取JSON字符串并将其解码为Python对象
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)
print(type(data))
「输出结果:」
{'name': '李四', 'age': 25, 'is_employee': False, 'skills': ['JavaScript', 'HTML', 'CSS']}
<class 'dict'>
「解释:」
with open('data.json', 'r', encoding='utf-8') as f
: 以读模式打开文件,并指定编码为UTF-8。json.load(f)
: 从文件中读取JSON字符串并将其解码为Python对象。
3. 处理复杂对象
对于一些复杂的数据类型,如自定义类对象,直接进行序列化和反序列化可能会遇到问题。这时需要自定义编码器和解码器。
示例5:自定义编码器和解码器
import json
class Contact:
def __init__(self, name, phone):
self.name = name
self.phone = phone
# 自定义编码器
class ContactEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Contact):
return {'name': obj.name , 'phone': obj.phone}
return super().default(obj)
# 自定义解码器
def decode_contact(dct):
if 'name' in dct and 'phone' in dct:
return Contact(dct['name'], dct['phone'])
return dct
# 创建一个Contact对象
contact = Contact("赵六", "1234567890")
# 序列化Contact对象
json_data = json.dumps(contact, cls=ContactEncoder, ensure_ascii=False, indent=4)
print(json_data)
# 反序列化JSON字符串为Contact对象
decoded_contact = json.loads(json_data, object_hook=decode_contact)
print(decoded_contact.name , decoded_contact.phone)
「输出结果:」
{
"name": "赵六",
"phone": "1234567890"
}
赵六 1234567890
「解释:」
ContactEncoder
: 自定义编码器,继承自json.JSONEncoder
,并重写了default
方法来处理Contact
类的对象。decode_contact
: 自定义解码器,用于将JSON对象转换为Contact
类的对象。
4. 格式化输出
在序列化过程中,可以通过设置参数来控制输出格式,使其更易读。
示例6:格式化输出
import json
# 定义一个Python字典
data = {
"name": "孙七",
"age": 22,
"is_employee": True,
"skills": ["Python", "Django", "Flask"]
}
# 将字典转换为JSON格式的字符串,并设置缩进和排序键
json_data = json.dumps(data, ensure_ascii=False, indent=4, sort_keys=True)
print(json_data)
「输出结果:」
{
"age": 22,
"is_employee": true,
"name": "孙七",
"skills": [
"Django",
"Flask",
"Python"
]
}
「解释:」
sort_keys=True
: 按照键的字母顺序对字典进行排序。
5. 数据类型转换对应表
在Python中,不同的数据类型在序列化和反序列化过程中会对应不同的JSON数据类型。以下是Python与JSON之间的数据类型转换对应表:
Python数据类型 | JSON数据类型 |
---|---|
dict | object |
list | array |
tuple | array |
str | string |
int | number |
float | number |
bool | true/false |
None | null |
总结
通过上述内容,我们可以看到Python中的json
模块提供了简单且强大的方法来实现数据的序列化和反序列化。无论是将Python对象转换为JSON格式的字符串,还是将JSON字符串转换回Python对象,都可以通过json.dumps()
、json.dump()
、json.loads()
和json.load()
方法轻松完成。对于复杂的数据类型,还可以通过自定义编码器和解码器来实现序列化和反序列化。通过这些方法,可以有效地在Python中处理和存储数据,无论是内存中的对象还是文件中的数据。