Python中序列化/反序列化JSON格式的数据
简介:
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
- 序列化(将 Python 对象转换为 JSON 字符串)
import json
data = {"name": "John", "age": 30, "city": "New York"}
json_str = json.dumps(data)
print(json_str)
- 在这个示例中,首先定义了一个包含姓名、年龄和城市信息的字典
data。然后使用json.dumps函数将这个字典转换为 JSON 字符串。dumps函数会将 Python 字典中的键和值转换为 JSON 格式的键值对,其中字符串会用双引号包裹,并且按照 JSON 的语法规则进行格式化。
- 序列化其他 Python 对象类型:
json模块还可以处理其他 Python 对象类型,如列表。例如:
import json
data_list = [1, 2, 3, {"key": "value"}]
json_str_list = json.dumps(data_list)
print(json_str_list)
- 这里定义了一个包含整数和字典的列表
data_list,json.dumps函数将其转换为 JSON 字符串。在 JSON 字符串中,列表元素会按照顺序排列,字典元素也会遵循 JSON 的格式规则。
- 自定义序列化(处理特殊对象):
- 有时候,我们可能需要对一些特殊的 Python 对象进行序列化,比如自定义的类。假设我们有一个简单的类
Person:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
- 直接使用
json.dumps会报错,因为json模块不知道如何处理Person类的对象。我们可以定义一个函数来将Person对象转换为可以序列化的字典:
def person_to_dict(person):
return {"name": person.name, "age": person.age}
json_str_person = json.dumps(p, default = person_to_dict)
print(json_str_person)
- 或者使用
lambda表达式:json_str_person = json.dumps(p, default = lambda o: o.__dict__),这里__dict__是 Python 对象的一个特殊属性,它返回一个包含对象属性和值的字典。
- 反序列化(将 JSON 字符串转换为 Python 对象)
import json
json_str = '{"name": "Bob", "age": 20, "city": "London"}'
data = json.loads(json_str)
print(data)
print(data["name"])
- 首先定义了一个 JSON 字符串
json_str,然后使用json.loads函数将其转换为 Python 对象。在这个例子中,转换后的对象是一个字典,我们可以通过字典的键来访问相应的值,如data["name"]来获取姓名信息。
- 反序列化 JSON 数组(列表):
- 当 JSON 字符串表示一个数组时,
json.loads会将其转换为 Python 列表。例如:
import json
json_str_list = '[1, 2, 3, {"key": "value"}]'
data_list = json.loads(json_str_list)
print(data_list)
print(data_list[3]["key"])
- 这里的
json_str_list是一个包含整数和字典的 JSON 数组。json.loads将其转换为 Python 列表后,我们可以通过索引来访问列表中的元素,对于字典元素,还可以通过键来访问值。