理解Python JSON模块中的自定义编码器和解码器2025年3月15日 | 阅读 28 分钟 编码器和解码器是计算机科学和信息技术中的重要概念,它们在数据在不同格式之间转换时起着关键作用。编码器用于将信息从原始形式转换为特定的编码形式,用于数据传输、存储或加密等目的。以数字通信为例,编码器用于确保数据传输的效率和安全性,而解码器则使接收者能够提取和理解传输的信息。无论是在视频或音频文件的编码、二进制数据的翻译,还是复杂加密算法的实现中,编码器和解码器都是帮助在各种应用程序中保持数据完整性、安全性和可用性的重要概念。 编码器编码器是一种系统或算法,用于将数据从一种格式转换为另一种格式。它以指定的表示形式(例如原始数据或文件格式)作为输入,并将其转换为另一种优化的格式,以便高效传输、存储或其他处理。通过再次转换数据,编码器确保了跨不同系统的效率。例如,在数字通信中,数据通过编码器进行压缩和格式化,以确保其可以通过网络以最小的损耗进行传输;在多媒体等应用程序中,视频和音频编码器将媒体文件转换为适合流式传输或存储的格式,例如 MP4 或 MP3。 传统上,在编程和数据交换领域,编码器被期望为一个函数、模块甚至系统,用于将特定形式的数据结构或对象转换为另一种形式,以便进行进一步的传输、存储或处理。编码器还负责在特定协议、系统或平台内的上下文中管理交换数据的结构。它们有效地促进了不同环境中的数据流动和管理,包括通信过程和应用程序开发。 不同上下文中的编码示例
解码器解码器用于反转编码过程。解码器的主要功能是接收编码后的数据(已转换为指定格式),并将其转换为系统有效使用的原始形式。这在许多领域都非常重要,例如数据传输、媒体播放和通信系统,这些领域需要将信息编码以高效存储或安全传输,然后解码并使用该数据以进行正确解释。解码器经常出现在视频流、音频压缩(例如 MP3 或 AAC 解码器)以及数字协议通信等应用程序中,以确保传输的数据或存储的数据能够在接收端被准确地重建,以实现正常功能。 编码器和解码器的关系通常,编码器和解码器协同工作,以便数据能够平稳地在应用程序和系统网络中传输、存储和检索。编码过程镜像了编码或改变数据结构的功能,其主要目的是准备进行传输、累积或未来的分析。由接收数据的系统使用和理解。 另一方面,解码器被创建为保持数据透明且未从其初始状态修改。 这种合并的一个重要目标是促进数据在多个平台、设备和应用程序之间的无缝且稳定的交换。 在 Python 中使用 encode() 和 decode() 函数encode() 方法遵循一种编码方案,可以是 UTF-8、ASCII 或任何其他合适的编码参数形式,并将给定内容更改为安全的字节格式。decode() 函数的目的是通过使用最初使用的编码处理形式来转换“写入”的编码字节数组为字符串,从而逆转 encode() 函数的效果。 在数据传输、文件 I/O 操作和网络通信等某些情况下,这些技术变得至关重要,因为实践中通常需要将记录的字符串数据转换为符合给定基本系统或协议的格式。一个典型的例子是读取或写入文件信息,或在网络内传输信息;这通常需要将字符转换为二进制形式,因为这些环境是在字节而不是字符串上运行的。 本文将重点关注“encode”和“decode”过程,分析它们遵循的技术、现有的使用约定以及指导选择特定情况最佳格式的法规。国际数据库中字符集和二进制数据的集成需要密切管理,因为编码和解码活动中的错误可能导致重要字符被误读或丢失。 编码给定的字符串在 Python 中,encode() 方法是在字符串上调用的,因为每个字符串默认都支持该方法。此函数在几种编码格式中将字符转换为其字节编码非常有用。encode() 方法的基本语法如下: 语法 encode() 方法使用特定的字符编码方案将字符串更改为字节数组。encoding 参数决定了要应用哪种编码系统,例如“UTF-8”、“ASCII”等。error 参数决定了在编码过程中如果存在该编码方案中不可接受的字符时会发生什么。它可以采用“strict”、“ignore”或“replace”等值。如果过程成功,encode() 会返回一个 bytes 对象。例如: 编码 输出 <class 'bytes'> b'Hello Welcome To Python!' 说明 代码从声明一个名为 string 的变量和一个名为 'Hello, Welcome To Python!' 的字符串值开始。下一步是使用 encode() 方法将上述字符串转换为字节,并将结果存储在 encoded 变量中。当字符串转换为字节时,encode() 函数默认使用“UTF-8”对字符串进行编码。print(type(encoded)) 代码打印 encoded 变量的类型,该类型将是 <class 'bytes'>,表示字符串已被转换为字节并进行了编码。print(encoded) 指令的输出是已编码的字节序列。 用于将特定字符串转换为字节序列的字符编码方案定义为 encoding 参数。有各种字符编码方案可用,例如“ASCII”、“UTF-16”、“UTF-32”等。但是,如果一个人不指定编码方案,Python 语言将使用“UTF-8”作为标准编码方案。“UTF-8”是一种非常通用且用户友好的编码方案,因为 Unicode 标准中的任何字符都可以用这种方案表示,因此非常实用。为了理解 encoding 参数如何工作,让我们通过一个例子来考虑 encoding 参数如何工作。 编码 输出 The original text This is a sample text Encoded string: b'This a sample text' 说明 变量 text 被设置为字符串 'This is a sample text'。之后,print() 命令显示原始字符串。在 text 上调用 encode() 方法,该方法将字符串转换为字节并以 utf text 格式保存,其标准编码为“UTF-8”。第二个 print() 命令打印出文本字符串的编码版本(字节序)。这说明了 encode() 方法在将字符字符串转换为字节等效项时的效果。 在这种情况下,输入字符串以 UTF-8 编码,这是 Python 的默认编码方法。即使从视觉上看,编码字符串的版本看起来并没有太大区别,您还会注意到编码版本的前面有一个小写字母 b。前缀 'b' 表示上述字符串的编码现在是字节格式,这是字符串的数值表示。当涉及到计算机时,数据以字节形式存储,人类无法查看。然而,在实践中,为了避免过度的不便,Python 程序确实提供了一个 bytes 对象的视图,该视图几乎与普通字符串相同,只是普通字符串前面有一个 'b',这表明它不是普通字符串,而是 bytes 对象。最重要的是,在这方面,因为它是数据在内存、文件、网络等中存储、传输或处理的最基本方式。但是,机器理解的字符串中有一些编码格式,虽然外观可能与纯文本字符串没有太大区别,但它与人类理解的普通字符串完全不同。 错误处理在执行 Unicode 解码时,可能会出现各种类型的错误,每种类型都有不同的处理失败方式。这些是错误处理方案,它们决定了当 Python 遇到无法正确解码的字符时会如何表现。其中大多数策略都是常见的:
现在,让我们用一个简单的例子来解决这个问题。想象一下,您有一个无法以任何方式显示不合理字符的输入字符串。例如,“ö”是此类特殊字符的绝佳示例。您可能无法以 ASCII 等方式对某些符号进行编码,因为它们无法直接表示。这样,您就理解了字符编码在现实生活中的工作原理以及为什么在软件中处理特殊或不规则字符很重要。 例如,大多数 编程语言 都为外语文本指定了内部默认字符集:扩展字符集。像“ö”这样的特殊字母使用 UTF-8 编写,而 ASCII 字符集限制为 128 个字符。在必须处理像 ASCII 这样的编码的约束下,在编码“ö”时,编码系统要么会失败,要么会做一些不可预测的事情。 让我们反过来。代替那个字符串,目标是编码成更广泛的编码,这意味着 UTF-8,以便编码器可以覆盖更广泛的字符集。随后,“ö”字符也将被包含在内。 错误处理机制。大多数编码库会提供这种错误纠正选项,例如 Brio:简单地删除“有问题”的字符,或者将其替换为“?”。 编码 输出 Original string: Python prögramming is quite än interesting topic! Encoded string with errors ignored: b'Python programming is quite an interesting topic!' Encoded string with characters replaced: b'Python programming is a quite an interesting topic!' 说明 在第一种编码方法中,使用参数 errors='ignore',当存在一些可以在上述编码模型中指定的字符时,例如我们案例中的“ñ”或“ä”,这些字符将被简单地忽略并从输出中删除。换句话说,编码字符串根本不包含这些字符,从而导致更好的输出,但信息丢失。当比保持字符串的整体形状更重要比其特定字符内容时,这会很有帮助。 另一方面,使用 errors='replace' 的第二种编码方法对不可编码字符采取了不同的视角,因为它不会丢弃它们。可以说,这些字符被转换为“?”等不可接受的字符。这种方法可以在内容无法编码为所需数字的情况下,保持字符串的组成形式。当我们希望在避免编码过程中的错误干扰的同时,处理有问题字符编码时,这种方法非常有效。 每个选项在特定情况下可能都有用:当忽略错误时,会获得连续的输出而不会中断;而当替换字符时,会清楚地表明编码消息的限制。 解码字节流与编码字符串类似,我们可以使用 decode() 函数将字节流解码为字符串对象。格式为: 编码 说明 在 Python 中,我们可以通过以下示例演示如何编码和解码字符串。调用 input_string 上的 encode() 后,编码过程将启动。然后,字符串被转换为字节流,默认使用 UTF-8 编码,这是正常编码,但您可以使用其他编码,如 UTF-16。然后将结果存储在 encoded 变量中。 通过 decode() 函数,您可以将字节流还原为字符串。decode() 函数将接收的主要参数之一是字符编码。在提供的示例中,指定了 UTF-8 或 ASCII 编码的使用,尽管有许多替代方案。另一个变量是 errors,它显示了如何处理错误。解码后,结果被设置为 decoded 变量。 如果处理不同的文本编码方法,例如文件输入/输出、通过网络发送数据或与需要另一种编码的其他系统交互,则此工作流程很有帮助。 编码 输出 Encoded string: b'Learning Python is fun and exciting.' Decoded string: Learning Python is fun and exciting. 说明 因此,在上面的第一个编码和解码 Python 示例中,变量 b = 'Learning Python is fun and exciting.' 的字符串使用第一行的 encode() 方法编码为字节。它默认使用 UTF-8 编码,所以我们使用它。结果是一个包含存储在变量 b_utf 中的数据的 bytes 对象,并且 print 会产生以下结果:learning Python is fun and exciting.' 然后,如果使用 decode() 方法对其进行解码,并打印倒数第二行的结果,您将获得正确的字符串:“Learning Python is fun and exciting.”这是一个费力地编码为字节然后又合理地解码它的例子。 如何在 Python 中使用 Json 编码器和解码器?JSON(JavaScript 对象表示法)是用于在应用程序之间交换数据的常见数据格式。它轻巧易读,基于 JavaScript 语法的子集,并且与对象和数组(以及其他键值对)配合良好。凭借其轻量级的结构和相对易用的特性,JSON 已成为网页相互通信的标准格式之一,特别是在与 API 和数据库之间来回传递信息时。 Python 提供了一个内置的 JSON 模块来方便地处理 JSON 数据,这样我们就不必使用第三方库来组织和操作 JSON 数据。json 模块包含两个函数,用于将 JSON 数据编码为 Python 对象(例如列表和字典)以及反之亦然。可以理解的是,json 模块可以轻松地在 Python 中处理 JSON 数据。任何与 JSON 的操作都将通过数据的可读性或通过促进数据以结构化格式保存或从外部数据源获取,从而使处理 JSON 更加轻松。 将 Python 对象编码为 JSON将 Python 对象编码为 JSON 是编程中的常见实践,尤其是在需要序列化数据以便在不同系统和平台之间存储和传输时。JSON(JavaScript 对象表示法)是一种轻量级且得到广泛支持的数据交换格式。它对人类可读,并且易于机器解析。特别是,JSON 是 Web 应用程序和 API 等通信和数据交换的绝佳选择。 在 Python 中,通过内置的 json 模块,将 Python 对象(特别是字典和列表)编码为 JSON 格式的过程非常简单。在 json 模块中,您会找到两个主要用于编码任务的函数:`json.dumps()` 和 `json.dump()`。`json.dumps()` 函数将 Python 对象序列化为 JSON 格式的字符串,当需要“以文本形式”传输数据(例如在 HTTP 响应中)时,这特别有用。相比之下,`json.dump()` 将 JSON 对象“直接”序列化到文件(或类文件对象)中,这提供了一种以有效的方式存储复杂结构的方法,而这些结构在“即时”编码时可能会很麻烦。总而言之,这两个函数 `json.dumps()` 和 `json.dump()` 都允许 Python 轻松地使用相对复杂的结构进行编码或序列化,同时保持语言和系统之间的通用交换方式。 Json.dumps() 方法json.dumps() 函数是一种将 Python 对象(从字典、列表、元组到字符串、整数、浮点数等)呈现为 JSON(JavaScript 对象表示法)格式字符串的方法。它特别有用,尤其是在将数据从 Python 序列化为某种轻量级数据交换格式时,该格式将主要用于 Web 服务和应用程序之间的通信。json.dumps() 将 Python 对象转换为 JSON 格式的字符串,该字符串可以被多个编程语言和应用程序轻松地以精心设计的格式存储。 例如,如果 Python 中有一个包含一些数据的字典,json.dumps() 会将其转换为 JSON 字符串,该字符串将发送在 HTTP 请求 中或存储到文件中。 编码 输出 [{"name": "Alice", "age": 25, "city": "London"}, {"name": "Bob", "age": 28, "city": "Paris"}, {"name": "Charlie", "age": 22, "city": "Berlin"}] 说明 这段 Python 代码使用 `json` 模块,将名为 `employee_data` 的字典列表转换为 JSON 格式的字符串。这个字典列表中的每个字典都格式化为一名员工,具有“name”、“age”和“city”等属性。`json.dumps()` 函数将 `employee_data` 对象序列化为 JSON 字符串,该字符串存储在 `json_output` 中。然后 `print()` 函数打印此字符串,显示适合 Web 或 API 通信的数据格式。 Json.dump()如果您需要将 JSON 数据直接写入文件,而不是先将其转换为 JSON 字符串,那么 json.dump() 将能做到这一点。json.dump() 函数允许将 Python 对象(如字典或列表)直接以 JSON 格式写入文件。将文件对象作为参数传递给 json.dump(),模块会为您处理写入;因此,您可以确定数据以适当的 JSON 格式存储。当您想要保存大型数据集或以某种结构化形式传输数据并在应用程序之间共享时,这一点非常有用。以下是您可以如何操作: 编码 输出 [ {"name": "Alice", "age": 25, "city": "London"}, {"name": "Bob", "age": 28, "city": "Paris"}, {"name": "Charlie", "age": 22, "city": "Berlin"} ] 说明 这段 Python 代码使用 `json.dump()` 函数将字典列表 (`employee_data`) 写入名为 `employee_data.json` 的 JSON 文件,该列表包含员工详细信息,如姓名、年龄和城市,而 `with open('employee_data.json', 'w') as file:` 语句以写入模式打开名为 `employee_data.json` 的文件。在 `with` 块内,`json.dump(employee_data, file)` 函数将 `employee_data` 列表转换为 JSON 格式,然后直接写入文件。执行完成后,将生成一个包含序列化数据的 JSON 文件。 处理自定义对象对字典、列表、字符串或数字等基本 Python 对象使用 `json.dumps()` 函数相对简单。但是,当需要序列化自定义对象(例如用户定义类的实例)时,通常需要额外的工作。JSON 本身不知道如何处理复杂或自定义的 Python 对象。您可以通过使用带有 `default` 参数的 `json.dumps()` 函数定义自定义序列化方法,或者通过继承 `json.JSONEncoder` 来定义自定义 JSON 编码器来解决此问题。无论哪种方式,您都将能够定义如何将自己的、可能不那么标准的 Python 对象转换为 JSON 兼容的格式,从而确保几乎任何可以确定哈希值的 Python 对象都可以通过转换并写入 JSON 格式以进行存储或进一步传输。 编码 输出 {"brand": "Tesla", "model": "Model S", "year": 2022} 说明 此代码生成一个自定义类 `Car`,该类具有 brand、model 和 year 属性。`custom_serializer` 中的自定义 `Car` 对象序列化以 JSON 友好格式完成。在 `custom_serializer` 函数中,它检查要表示的对象是否为 `Car` 类型。如果是,则调用适当的方法将对象转换为相应的字典。否则,如果对象不是 `Car` 类型,则会引发 `TypeError`。因此,创建一个品牌为“Tesla”,型号为“Model S”,年份为 2022 的 `Car` 对象。通过调用 `json.dumps()` 使用自定义序列化器将 `car_obj` 序列化为 JSON 字符串。最后,打印 JSON 字符串。 始终将异常处理构建为供开发人员遵循的稳健的警告,以便在符合 JSON 序列化规则支持的数据类型的情况下,尽可能少地手动处理可序列化对象。此外,一些自定义对象必须始终转换为 JSON 词汇表中可识别的编码(即映射),然后再进行序列化,因为 JSON 只能理解字符串、数字、数组和对象等有限的数据类型。未能这样做可能导致序列化过程中出现错误,并可能导致编码中断。 JSON(JavaScript 对象表示法)是一种轻量级且最常用的数据交换格式。这是因为它是用于在不同系统或平台之间传递和存储结构化信息的理想选择,或者它们之间可以极其顺畅地通信。其简洁性和人类可读的语法使其成为 API 响应、配置文件和 Web 应用程序中数据传输的受欢迎选择。通过正确地适应 JSON,现代软件环境允许组件之间的平滑集成和通信。 将 JSON 字符串解码为 Python 对象将 JSON 字符串解码为 Python 对象只是这个过程的反向过程:将 Python 对象编码为 JSON。Python 的 `json` 模块为此过程包含方便的内置函数,允许将 JSON 格式的字符串解析回本地 Python 数据结构(如字典、列表和原始类型,如整数和字符串)。 解码过程中有两个主要函数:`json.loads()` 和 `json.load()`。虽然 `json.loads()` 解析 JSON 字符串并提供相应的 Python 对象,但 `json.load()` 特别适用于从类文件对象读取 JSON 数据并将其转换为 Python 对象。JSON 格式的输入直接转换为 Python 中的简单使用,通过常见的数据交换通道连接不同的系统或应用程序。因此,在通过通常使用 JSON 的 API、配置文件或数据库集成外部数据源时,正确的解码至关重要。 使用 json.loads()简单来说,`json.loads()` 函数就像一把剪刀,可以剪开 JSON 字符串,并将里面的所有内容转录为相应的 Python 对象。解析到这些 Python 对象中意味着,正如人类创建字符串一样,最不同的人(在此情况下是计算机)读取字符串,以结构化的方式解释其结构,并最终将其转换为 Python 数据类型,如 dicts、lists、strings、floats、ints、true、false 或 none。 例如,如果 JSON 字符串表示一个对象或一组键值对,`json.loads()` 会将其转换为 Python 字典。同样,JSON 数组会转换为 Python 列表。当您从应用程序外部源、Web API 或某些配置文件获取 JSON 数据并需要将其转换为可用的 Python 对象以便轻松处理时,此函数特别有用。它能够将该字符串解析好,并在之后以与处理任何其他本地 Python 数据结构相同的方式进行处理。 编码 输出 Decoded Python Object: {'first_name': 'Alice', 'age': 25, 'location': 'London'} Name: Alice Age: 25 Location: London 说明 此模块导入 json 模块以在 Python 上下文中处理 JSON 数据。它以一个名为 json_string 的变量开始,该变量包含有关一个人的信息。使用 json.loads() 函数将此 JSON 字符串反序列化为名为 python_object 的 Python 字典。打印此字典以显示其值。然后,从字典中提取值并单独打印,包括姓名、年龄和位置。此示例演示如何将 JSON 字符串解码为 Python 对象,并随后访问其元素。 使用 json.load()假设您有一个 JSON 文件并希望将该文件的内容读取到某个 Python 对象中。您的最佳选择是 `json.load()`。该函数从文件中读取 JSON 数据并直接将其转换为 Python 对象——您猜对了,字典或列表。与必须解析 JSON 字符串的 `json.loads()` 不同,`json.load()` 可以直接接收文件对象。然后,通过以读取模式打开文件并将文件传递给 `json.load()` 来解析 JSON 数据,并在 Python 代码中稍后处理或分析它。 编码 输出 The content of the JSON file as a Python object 说明 以下是如何使用 json.load() 函数从 JSON 文件读取数据并将其转换为 Python 对象(例如字典或列表)。JSON - JavaScript 对象表示法,轻巧、易于读写,用于数据交换,自 2000 年以来由软件公司 Sun 推广。 代码开始于使用 `with open('data.json', 'r')` 语句打开一个 JSON 文件。在这里,它以读取模式 ('r') 打开 JSON 文件。关键字打开文件,并在代码块完成后自动关闭它,因此不会出现文件处理错误,例如文件未关闭。在此块内,`json.load` 函数从文件内容中读取并解析 JSON 数据。在这种情况下,它通常是一个包含一系列键值对的 JSON 字典,或者是一个 JSON 数组的 JSON 列表。 最后,我们将解析后的 Python 对象分配给 data 变量。然后,`print(data)` 打印出 Python 对象,以便真正看到来自 JSON 文件的原始数据的实际结构和内容。当您需要处理任何包含结构化数据的 JSON 文件时,例如配置文件、API 响应和来自 Web 服务的数据,这非常有用。 处理 JSON 到自定义 Python 对象的转换有时,您可能更希望将 JSON 对象反序列化为您自己的 Python 对象,而不是内置的 Python 类型(如字典或列表)。在这种情况下,您可以使用 `json.loads()` 或 `json.load()` 的 `object_hook` 参数。`object_hook` 可用于指定您自己的函数,以便在解码时将任何 JSON 对象转换为您自己的特定 Python 对象。然后,当您将 JSON 对象传递给 `json.loads()` 或 `json.load()` 时,将应用此自定义函数,从而允许您的 JSON 数据映射到更适合您应用程序需求的自定义类或结构。 这对于具有复杂数据模型的场景非常有用,您可以将 JSON 转换为为此目的定制的 Python 类,然后使数据进一步处理或操作更加容易。例如,您可以获取包含个人详细信息的 JSON 并将其转换为 `Person` 类,通过包含方法和属性,使其更直观地进行数据操作。在此上下文中,使用 `object_hook`,您可以控制来自 JSON 的数据如何转换为 Python 对象,这总是很复杂的。 编码 输出 Tesla Model S 2020 说明 以下是上面解释的代码:此代码会将 JSON 字符串解码为 Python 中的自定义对象 (`Car`)。首先定义带有 `make`、`model` 和 `year` 属性的 `Car` 类:现在使用此 `custom_decoder` 函数来验证 JSON 对象是否包含这些键,并且它应该将此内容转换为 `Car` 对象。JSON 字符串的示例,其中 `Car` 使用 `json.loads()` 加载,并将 `custom_decoder` 作为 `object_hook` 传递以将 JSON 数据解码回 `Car` 实例。然后,通过自定义对象的属性打印所有 `Car` 详细信息。 给定的 JSON 字符串应自然解码为特定的 Python 对象:例如,`Car` 实例。`Car` 类定义了汽车的三个属性:`make`、`model` 和 `year`。一个名为 `custom_decoder` 的解码器被制作成一个助手,它检查 JSON 对象中是否存在键。在这种情况下,函数将继续运行,并根据 JSON 数据中找到的正确值创建并返回一个新的 `Car` 对象。`json.loads()` 采用 JSON 字符串并将其解析为 Python 对象。此处,此函数被作为 `object_hook` 传递。这会导致 JSON 数据直接解码为 `Car` 对象。在序列化为 JSON 后,它会显示新实例化的 `Car` 的 `make`、`model` 和 `year` 属性。这会将半结构化的 JSON 数据转换为 Python 环境中的用户定义对象,以便于处理和操作。 创建自定义编码器和解码器可以构建自定义编码器和解码器来指定如何将自定义对象或非标准数据类型与 JSON 格式进行编组和解组,从而使序列化和反序列化过程平滑。序列化是将 Python 对象(例如用户定义类的实例)转换为 JSON 格式的字符串。反序列化是将 JSON 格式的字符串反向转换回相应的 Python 对象。这就是自定义编码器为您确保的内容:将复杂对象或特殊数据类型转换为 JSON 能理解的格式。同样,它们帮助您解释 JSON 数据并将其重建为 Python 对象,这在处理应用程序中的非标准数据时非常有用。当内置方法对于复杂或高度专业化的对象不够健壮时,这使得处理 JSON 更加灵活。 自定义 Json 编码器通用模式是继承 `json.JSONEncoder` 类并覆盖其 `default()` 方法:您想创建自己的自定义 JSON 编码器。每当 Python 遇到它无法按照其传统序列化规则进行序列化的内容时,就会调用 `default()` 方法。因此,您可以覆盖 `default()` 方法,允许您定义不支持 JSON 序列化的对象(例如,类的实例)如何转换为另一种格式(可能是字典或字符串),以便在 JSON 格式内进行序列化。它使处理 JSON 中没有原生支持的对象变得灵活,以便进行序列化。当您拥有复杂的类实例或需要以 JSON 表示的对象,但仍需要完全控制这些对象如何被序列化时,自定义 JSON 编码器会非常有用。 编码 输出 {"make": "Tesla", "model": "Model S", "year": 2022} 说明 它将声明一个自定义类 `Car` 和自定义 JSON 编码器 `CustomCarEncoder`,它会将 `Car` 对象序列化为 JSON 格式。`Car` 类包含三个属性,即 `make`、`model` 和 `year`。此类 `CustomCarEncoder` 继承自 `json.JSONEncoder`,因为它首先覆盖 `default` 函数,以检查是否能将正在序列化的对象转换为字典(如果该对象恰好是 `Car` 的实例)。最后,创建一个 `Car` 对象,并使用自定义编码器通过 `json.dumps` 方法将对象转换为 JSON 字符串。 自定义 JSON 解码器您可以使用 `json.loads()` 或 `json.load()` 函数的 `object_hook` 参数来构建一个定制的 JSON 解码器。`object_hook` 参数使用一个函数,该函数将在解码过程中对每个 JSON 对象进行调用。需要定义一个自定义函数,以便您确切地知道某些 JSON 对象应如何反向转换为 Python 对象,例如将 JSON 数据映射回某个类的实例或在解码过程中执行任何其他自定义逻辑。在涉及的数据复杂或定制并需要特殊处理而不是默认行为的情况下,这种功能至关重要。 编码 输出 1984 George Orwell 1949 说明 上面的 Python 代码定义了一个 `Book` 类,用于建模一个具有三个特征(title、author 和 year)的书籍对象。一个自定义解码函数 `custom_decoder` 被定义为一个将 JSON 对象转换为 `Book` 类实例的函数。`custom_decoder` 将检查传入的对象是否包含“title”、“author”和 year 键。如果存在,则返回一个 `Book` 对象;否则,返回对象本身。然后,使用 `json.loads()` 函数解码书籍的示例 JSON 字符串,并将 `object_hook` 与 `custom_decoder` 一起传递。最后,我们将使用点符号访问并打印解码后的 `Book` 对象的属性。 自定义编码器和解码器的优势在 Python json 模块中创建自定义编码器和解码器具有许多优势。其中之一是能够将复杂的 Python 对象或非标准数据类型序列化和反序列化为 JSON 格式,反之亦然。这意味着您可以处理 JSON 本身不原生支持的对象,例如自定义类的实例。
结论通过使用 Python 的 json 模块创建自定义编码器和解码器,程序员可以灵活地处理不同类型的数据并高效地执行序列化和反序列化,这在处理可能只是集成并顺利运行在 Python 应用程序中的复杂结构或自定义类时非常重要。 |
我们请求您订阅我们的新闻通讯以获取最新更新。