Python 中的 JSON
Python 中的 JSON 是一种用于系统间数据交换的常用数据格式。json模块提供了处理JSON数据的函数,允许你将Python对象序列化成JSON字符串,并将JSON字符串反序列化回Python对象。
JSON(JavaScript对象符号)是一种轻量级的数据交换格式,易于人类阅读和写入,机器也易于解析和生成。它主要用于服务器与网页应用之间的文本传输数据。
JSON 序列化
JSON 序列化是将 Python 对象转换为 JSON 格式的过程。这对于保存数据格式方便传输或存储,之后还能重建为原始形式非常有用。
Python 提供了 JSON 模块来处理 JSON 序列化和反序列化。我们可以在本模块中使用json.dumps()方法进行序列化。
你可以将以下 Python 对象类型序列化为 JSON 字符串 −
- dict
- list
- tuple
- str
- int
- float
- bool
- None
示例
按照一个基本示例,了解如何将 Python 字典序列化为 JSON 字符串 −
import json
# Python dictionary
data = {"name": "Alice", "age": 30, "city": "New York"}
# Serialize to JSON string
json_string = json.dumps(data)
print(json_string)
它将产生以下输出 −
{"name": "Alice", "age": 30, "city": "New York"}
JSON 反序列化
JSON 反序列化是将 JSON 字符串转换回 Python 对象的过程。这对于读取和处理以 JSON 格式传输或存储的数据至关重要。
在 Python 中,我们可以使用 json.loads() 方法将 JSON 数据从字符串 反序列化,使用 json.load() 方法将 JSON 数据从文件反序列化。
示例:将 JSON 字符串反序列化为 Python 对象
在下面的例子中,我们使用 json.loads() 方法 − 将 JSON 字符串反序列化成 Python 字典
import json
# JSON string
json_string = '{"name": "John", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": {"city": "New York", "state": "NY"}}'
# Deserialize JSON string to Python object
python_obj = json.loads(json_string)
print(python_obj)
以下是上述代码−的输出
{'name': 'John', 'age': 30, 'is_student': False, 'courses': ['Math', 'Science'], 'address': {'city': 'New York', 'state': 'NY'}}
示例:从文件中反序列化 JSON
现在,要读取和反序列化文件中的 JSON 数据,我们使用 json.load() 方法------
import json
# Read and deserialize from file
with open("data.json", "r") as f:
python_obj = json.load(f)
print(python_obj)
上述代码的输出如下 −
{'name': 'John', 'age': 30, 'is_student': False, 'courses': ['Math', 'Science'], 'address': {'city': 'New York', 'state': 'NY'}}
高级 JSON 处理
如果你的 JSON 数据包含需要特殊处理的对象(例如自定义类),你可以自定义反序列化函数。使用json.loads()或json.load()方法的object_hook参数,指定一个函数调用,调用每个解码后的JSON对象的结果。
示例
在下面的示例中,我们演示了自定义对象序列化的使用 −
import json
from datetime import datetime
# Custom deserialization function
def custom_deserializer(dct):
if 'joined' in dct:
dct['joined'] = datetime.fromisoformat(dct['joined'])
return dct
# JSON string with datetime
json_string = '{"name": "John", "joined": "2021-05-17T10:15:00"}'
# Deserialize with custom function
python_obj = json.loads(json_string, object_hook=custom_deserializer)
print(python_obj)
我们得到如下所示的输出−
{'name': 'John', 'joined': datetime.datetime(2021, 5, 17, 10, 15)}
JSONEncoder Class
Python 中的 JSONEncoder 类用于将 Python 数据结构编码为 JSON 格式。每个 Python 数据类型都被转换为对应的 JSON 类型,如下表所示 −
| Python | JSON |
|---|---|
| Dict | object |
| list, tuple | array |
| Str | string |
| int, float, int- & float-derived Enums | number |
| True | true |
| False | false |
| None | null |
JSONEncoder类是使用JSONEncoder()构造函数实例化的。本类中定义了以下重要方法:
-
encode(obj) − JSONEncoder类是使用JSONEncoder()构造函数实例化的。本类中定义了以下重要方法:
-
iterencode(obj) − 对对象进行编码,并返回一个迭代器,该迭代器生成对象中每个项目的编码形式。
-
indent − 确定编码字符串的缩进级别。
-
sort_keys − 如果为True,则键按排序顺序显示。
-
check_circular − 如果为True,则检查容器类型对象中的循环引用。
示例
在下面的例子中,我们正在编码 Python 列表对象。我们使用 iterencode() 方法显示编码字符串的每个部分 −
import json
data = ['Rakesh', {'marks': (50, 60, 70)}]
e = json.JSONEncoder()
# Using iterencode() method
for obj in e.iterencode(data):
print(obj)
它将产生以下输出 −
["Rakesh", { "marks" : [50, 60, 70]}]
JSONDecoder class
JSONDecoder 类用于将 JSON 字符串解码回 Python 数据结构。该类的主要方法是 decode()。
示例
在这个例子中,"JSONEncoder"用于将Python列表编码成JSON字符串,然后用"JSONDecoder"将JSON字符串解码回Python列表------
import json
data = ['Rakesh', {'marks': (50, 60, 70)}]
e = json.JSONEncoder()
s = e.encode(data)
d = json.JSONDecoder()
obj = d.decode(s)
print(obj, type(obj))
得到的结果如下所示 −
['Rakesh', {'marks': [50, 60, 70]}] <class 'list'>
Python JSON 模块方法
Python 中的 json 模块提供了处理 JSON(JavaScript 对象符号)的方法。它允许你将 Python 对象序列化和反序列化,用于与 JSON 格式之间的转换,这是一种常用的数据交换格式。
核心职能
json模块的核心功能允许你序列化和反序列化JSON数据。
| Sr.No。 | 功能与描述 |
|---|---|
| 1 | json.dump() |
| 2 | json.dumps() 序列化一个 Python 对象,并返回为 JSON 格式的字符串。 |
| 3 | json.load() 将 JSON 格式的流反序列化为 Python 对象。 |
| 4 | json.loads() 将JSON格式的字符串反序列化成Python对象。 |
JSON 编码方法
JSON 编码器方法处理 Python 对象转换为 JSON 格式。
| Sr.No。 | 功能与描述 |
|---|---|
| 1 | json.JSONEncoder 用于将 Python 对象转换为 JSON 格式的编码器类。 |
| 2 | json.JSONEncoder.encode() 将 Python 对象编码为 JSON 格式,作为字符串。 |
| 3 | json.JSONEncoder.iterencode() 将 Python 对象编码为迭代器格式的 JSON 格式。 |
| 4 | json.JSONEncoder.default() 覆盖处理默认不可序列化对象的方法。 |
JSON 解码器方法
JSON 解码器方法处理将 JSON 数据转换为 Python 对象。
| Sr.No。 | 功能与描述 |
|---|---|
| 1 | json.JSONDecoder 用于将JSON数据转换为Python对象的解码器类。 |
| 2 | json.JSONDecoder.decode() 将JSON字符串反序列化成Python对象。 |
| 3 | json.JSONDecoder.raw_decode() 将带有额外信息的 JSON 字符串反序列化,以便错误处理。 |
效用函数
实用函数为处理 Python 中的 JSON 数据提供了一种简单的方法。
| Sr.No。 | 功能与描述 |
|---|---|
| 1 | json.tool 提供命令行工具,用于格式化JSON数据以提高可读性。 |
Dunder (Magic) Methods in JSONEncoder
这些是 JSON 模块中 JSONEncoder 类的特殊方法,使 JSON 序列化能够实现自定义行为。
| Sr.No。 | 方法与描述 |
|---|---|
| 1 | json.JSONEncoder.init 用自定义设置初始化编码器。 |
| 2 | json.JSONEncoder.repr 返回编码器对象的字符串表示。 |
| 3 | json.JSONEncoder.str 返回编码器对象的字符串版本。 |
JSONDecoder 中的 Dunder (Magic) 方法
这些是JSONDecoder类的特殊方法,用于实现JSON反序列化的自定义行为。
| Sr.No。 | 方法与描述 |
|---|---|
| 1 | json.JSONDecoder.init 用自定义设置初始化解码器。 |
| 2 | json.JSONDecoder.repr 返回解码器对象的字符串表示。 |
| 3 | json.JSONDecoder.str 返回解码器对象的字符串版本。 |
json.encoder中的函数(内部实用函数)
这些函数在json.encoder模块内部用于处理特定的编码任务。
| Sr.No。 | 功能与描述 |
|---|---|
| 1 | json.encoder.encode_basestring() 将字符串编码成兼容 JSON 的格式。 |
| 2 | json.encoder.encode_basestring_ascii() 将字符串编码为兼容JSON的ASCII格式。 |
json.decoder中的函数(内部实用函数)
这些函数在json.decoder模块内部用于处理特定的解码任务。
| Sr.No。 | 功能与描述 |
|---|---|
| 1 | json.decoder.scanstring() 扫描JSON格式的字符串。 |
| 2 | json.decoder.JSONArray() 处理JSON数组解码。 |
json 模块中的属性
属性在 json 模块中提供各种配置设置和常量。
| Sr.No。 | 属性与描述 |
|---|---|
| 1 | json.decoder 包含与解码器相关的函数和类。 |
| 2 | json.encoder 包含与编码器相关的函数和类。 |
| 3 | json.all 当导入 * 时导出的模块属性列表。 |
| 4 | json.version json模块的版本号。 |
Attributes in json.encoder
与json.encoder模块编码功能相关的属性。
| Sr.No。 | 属性与描述 |
|---|---|
| 1 | json.encoder.FLOAT_REPR 在序列化过程中控制浮点数的表示。 |
| 2 | json.encoder._make_iterencode() 用于创建基于迭代器的编码器的内部实用函数。 |
json.decoder 中的属性
与json.decoder模块中解码功能相关的属性。
| Sr.No。 | 属性与描述 |
|---|---|
| 1 | json.decoder.JSONDecoder 用于将JSON数据转换为Python对象的解码器类。 |
| 2 | json.decoder.JSONDecoder.object_hook 用于解析和转换 JSON 对象的函数。 |
| 3 | json.decoder.JSONDecoder.parse_float 函数用于自定义JSON数据中的浮点解码。 |
| 4 | json.decoder.JSONDecoder.parse_int 函数用于在 JSON 数据中自定义整数解码。 |
| 5 | json.decoder.JSONDecoder.parse_constant 用于处理JSON解码时常数值如True、False和None的功能。 |
| 6 | json.decoder.JSONDecoder.object_pairs_hook 用于解析 JSON 对象并控制其键值对的函数。 |
JSON 中的属性(内部使用)
这些属性是json模块内部使用的。
| Sr.No。 | 属性与描述 |
|---|---|
| 1 | json._default_decoder 用于解码JSON数据的默认JSON解码器。 |
| 2 | json._default_encoder 默认的 JSON 编码器,用于将 Python 对象编码成 JSON。 |