自定义 JSON 编码
Coddy Python JSON 课程的第 6 课,共 9 课。
自定义 JSON 编码是 Python 的 json 模块中的一项强大功能,可用于序列化 JSON 原生不支持的复杂 Python 对象。在处理自定义类或没有直接 JSON 表示形式的对象时,这项功能尤其有用。
JSONEncoder 类
要创建自定义 JSON 编码器,你需要继承 json.JSONEncoder 类并重写它的 default() 方法:
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, YourCustomClass):
return obj.to_dict() # 将你的对象转换为字典
return json.JSONEncoder.default(self, obj)
使用自定义编码器
定义好自定义编码器后,你可以将它与 json.dumps() 或 json.dump() 一起使用:
json_string = json.dumps(your_object, cls=CustomEncoder)
示例:编码自定义类
来看一个实际示例:
import json
from datetime import datetime
class Person:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "birthdate": obj.birthdate.isoformat()}
elif isinstance(obj, datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
person = Person("Alice", datetime(1990, 5, 15))
json_string = json.dumps(person, cls=CustomEncoder, indent=2)
print(json_string)
这个示例展示了如何编码自定义的 Person 类,以及如何处理其中的 datetime 对象。
要点
- 对于无法原生序列化的对象,会调用
default()方法。 - 对于未知类型,始终提供回退到默认编码器的处理方式。
- 自定义编码器适用于处理复杂数据结构、自定义类和非标准 Python 类型。
使用自定义 JSON 编码器,你可以将复杂的 Python 对象无缝集成到 JSON 工作流中,让数据序列化更加灵活、强大。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
挑战
简单为 ComplexNumber 类创建一个自定义 JSON 编码器。该编码器应将复数转换为 JSON 对象,分别使用 'real' 和 'imag' 作为实部和虚部的键。
- 定义一个包含
real和imag属性的ComplexNumber类。 - 创建一个自定义的
JSONEncoder子类,用于处理ComplexNumber对象。 - 实现一个函数,该函数接收一个由
ComplexNumber对象组成的列表,并使用自定义编码器返回 JSON 字符串表示。
将提供以下输入:
3.14,2.71
1.41,-1.73
2.0,0
0,-1
每行表示一个复数,实部和虚部用逗号分隔。
打印生成的 JSON 字符串。确保 JSON 使用 2 个空格缩进。
亲手试试
import json
# 读取输入
complex_numbers = []
while True:
try:
line = input().strip()
if line:
real, imag = map(float, line.split(','))
complex_numbers.append((real, imag))
except EOFError:
break
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
# TODO: 创建一个自定义的 JSONEncoder 子类,用于处理 ComplexNumber 对象
# TODO: 实现一个函数,接收 ComplexNumber 对象的列表并返回 JSON 字符串
# TODO: 将输入数据转换为 ComplexNumber 对象,并用你的函数创建 JSON 字符串
# 打印生成的 JSON 字符串
print(json_string)Python JSON中的所有课
自己练习: Python 在线编译器