Menu
CoddyTech

自定义 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 工作流中,让数据序列化更加灵活、强大。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

challenge icon

挑战

简单

为 ComplexNumber 类创建一个自定义 JSON 编码器。该编码器应将复数转换为 JSON 对象,分别使用 'real' 和 'imag' 作为实部和虚部的键。

  1. 定义一个包含 real 和 imag 属性的 ComplexNumber 类。
  2. 创建一个自定义的 JSONEncoder 子类,用于处理 ComplexNumber 对象。
  3. 实现一个函数,该函数接收一个由 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 在线编译器