📅  最后修改于: 2023-12-03 15:35:57.942000             🧑  作者: Mango
在Python的json
模块中,我们常常使用json.dumps()
或json.dump()
方法将Python对象转换为JSON字符串。但是,在使用这些方法时,可能会遇到“TypeError: Object of type XYZ is not JSON serializable”这样的错误。这是因为JSON只允许对字典类型的对象进行序列化,而对于其他类型的对象,例如自定义类或元组等,json
模块无法识别并且抛出异常。
为了允许json
模块正确地序列化非字典类型的对象,可以在调用json.dumps()
或json.dump()
方法时将safe
参数设置为False
。这意味着我们放弃了默认的安全保障,不再要求序列化的数据必须是字典类型的对象,而是允许对任何类型的对象进行序列化。
下面是一个使用json.dumps()
和json.dump()
方法序列化自定义类和元组的示例:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
t = (1, 2, "three")
# 使用dumps()方法序列化对象
json_str1 = json.dumps(p.__dict__, indent=4, sort_keys=True, safe=False)
json_str2 = json.dumps(t, indent=4, sort_keys=True, safe=False)
# 使用dump()方法将对象序列化并写入文件
with open("person.json", "w") as f:
json.dump(p.__dict__, f, indent=4, sort_keys=True, safe=False)
with open("tuple.json", "w") as f:
json.dump(t, f, indent=4, sort_keys=True, safe=False)
需要注意的是,当安全参数设置为False
时,需要小心处理可能引起的安全问题。例如,将使用者的输入反序列化为Python对象可能会受到恶意攻击。而且,序列化的对象必须确保可以被正确地反序列化回原始对象。
因此,当需要序列化非字典类型的对象时,应该谨慎地考虑使用safe
参数,并在确保安全性的前提下使用该参数。