Python - JSON



Python 中的 JSON

Python 中的 JSON 是一种流行的数据格式,用于系统之间的数据交换。json 模块提供了处理 JSON 数据的函数,允许您将 Python 对象序列化为 JSON 字符串,并将 JSON 字符串反序列化回 Python 对象。

JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式,易于人类读写,也易于机器解析和生成。它主要用于在服务器和 Web 应用程序之间以文本形式传输数据。

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 类

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) - 将 Python 对象序列化为 JSON 格式的字符串。
  • 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 类

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'>