JSON 在 Python 中是一种流行的数据格式,用于系统间的数据交换。json 模块提供了处理 JSON 数据的功能,允许你将 Python 对象序列化为 JSON 字符串或将 JSON 字符串反序列化回 Python 对象。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。它主要用于作为文本在服务器和 Web 应用之间传输数据。
JSON 序列化
JSON 序列化是指将 Python 对象转换成 JSON 格式的过程。这对于将数据保存为易于传输或存储的格式很有用,并且稍后可以重构回其原始形式。
Python 提供了 json 模块来处理 JSON 的序列化和反序列化。我们可以使用此模块中的 json.dumps()
方法来进行序列化。
你可以将以下类型的 Python 对象序列化为 JSON 字符串:
示例
下面是一个基本示例,演示如何将 Python 字典序列化为 JSON 字符串:
import json
data = {"name": "Alice", "age": 30, "city": "New York"}
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 = '{"name": "John", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": {"city": "New York", "state": "NY"}}'
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
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
def custom_deserializer(dct):
if 'joined' in dct:
dct['joined'] = datetime.fromisoformat(dct['joined'])
return dct
json_string = '{"name": "John", "joined": "2021-05-17T10:15:00"}'
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)
— 编码对象并返回一个迭代器,该迭代器产生对象中每一项的编码形式。
此外,还有一些属性:
-
-
sort_keys
— 如果为 True,则键以排序顺序出现。
-
check_circular
— 如果为 True,则检查容器类型对象中的循环引用。
示例
在下面的示例中,我们对 Python 列表对象进行了编码。我们使用 iterencode()
方法显示编码字符串的每一部分:
import json
data = ['Rakesh', {'marks': (50, 60, 70)}]
e = json.JSONEncoder()
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'>