在 Python 的 json 模块中,default 参数用于处理那些 JSON 编码器无法直接序列化的对象。默认情况下,json.dumps() 只能序列化基本的数据类型如字典、列表、字符串、整数、浮点数和布尔值等。如果你尝试序列化一个自定义对象或不支持的类型(例如 datetime 对象),将会抛出 TypeError。
为了处理这种情况,你可以通过传递一个函数给 json.dumps() 或者继承 json.JSONEncoder 类并重写 default() 方法来指定如何序列化这些特殊类型的对象。这个函数或方法应该接受一个参数(即要序列化的对象),并且返回该对象的一个可序列化的表示形式。如果对象类型仍然无法被序列化,则应调用基类的 default() 方法来引发适当的异常。
使用 default 参数的基本示例
假设你有一个包含 datetime 对象的字典,并希望将其转换为 JSON 字符串:
import jsonfrom datetime import datetimedata = { "time": datetime.now()}def custom_serializer(obj): """自定义序列化函数""" if isinstance(obj, datetime): return obj.isoformat() # 将 datetime 转换为 ISO 格式的字符串 raise TypeError(f"Type {type(obj)} not serializable")json_str = json.dumps(data, default=custom_serializer)print(json_str)# 输出类似于:{"time": "2025-05-07T16:39:45.123456"}在这个例子中,custom_serializer 函数检查传入的对象是否为 datetime 类型。如果是,则使用 isoformat() 方法将其转换为字符串格式;如果不是,则通过 raise TypeError 抛出异常,提示该类型不可序列化。
继承 JSONEncoder 类
除了直接提供 default 函数外,还可以通过继承 json.JSONEncoder 来创建自己的编码器类,并重写 default() 方法:
class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.isoformat() # 如果对象不是 datetime 类型,则调用基类的方法 return super().default(obj)json_str = json.dumps(data, cls=CustomEncoder)print(json_str)# 输出类似于:{"time": "2025-05-07T16:39:45.123456"}
这种方式更灵活,特别适合于需要在多个地方复用相同序列化逻辑的情况。
总结
default 参数允许你指定如何序列化那些 json 模块默认不支持的对象。
它可以是一个函数,该函数接收一个对象作为输入,并返回其可序列化的表示形式。
或者可以通过继承 JSONEncoder 并重写 default() 方法来自定义整个编码过程。
当遇到不支持的类型时,确保你的 default 函数或方法最终会调用基类的 default() 方法以避免遗漏错误。
这种方法极大地扩展了 json 模块的功能,使得它可以处理更多种类的数据结构。
更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!