json
模块是 Python 标准库中的一个模块,用于处理 JSON(JavaScript Object Notation)格式的数据。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。模块提供了在 Python 中进行 JSON 编码(序列化)和解码(反序列化)的功能。json
以下是 json
模块的主要函数和用法:
1.json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
:
将 Python 对象 obj
转换为 JSON 格式的字符串。
这些参数提供了在序列化过程中控制行为的灵活性,可以根据需要选择适当的参数值。
-
obj:必需参数,要序列化为 JSON 字符串的 Python 对象。通常是字典、列表、元组等可序列化的对象。
-
skipkeys(默认为 False):如果设置为 True,在序列化字典对象时跳过非字符串键。如果字典包含非字符串键,则会引发 。默认情况下,这个参数是 False,表示不跳过非字符串键。
TypeError
-
ensure_ascii(默认为 True):如果设置为 True,所有非 ASCII 字符将转义为 ASCII。如果设置为 False,则允许非 ASCII 字符原样输出。默认情况下,这个参数是 True。
-
check_circular(默认为 True):如果设置为 True,检查循环引用(例如,一个对象是另一个对象的属性,而后者又是前者的属性)。如果检测到循环引用,会引发 。如果设置为 False,将不会检查循环引用,但可能导致无限递归和堆栈溢出。默认情况下,这个参数是 True。
ValueError
-
allow_nan(默认为 True):如果设置为 True,允许 JSON 中的 NaN、Infinity 和 -Infinity。如果设置为 False,将不允许这些特殊的浮点数值,而是引发 。默认情况下,这个参数是 True。
ValueError
-
cls:用于指定自定义的 JSON 编码器类。这个参数应该是一个 JSONEncoder 的子类。默认情况下,使用 类进行编码。
json.JSONEncoder
-
indent:用于指定缩进的空格数,使生成的 JSON 字符串更易读。默认情况下,不进行缩进,即不进行格式化。
-
separators:用于指定不同部分之间的分隔符,应该是一个包含两个字符的元组,例如 。第一个字符用于分隔项之间的间隔,第二个字符用于分隔键值对之间的间隔。默认情况下,使用 和 作为分隔符。
(',', ':')
,
:
-
default:用于指定一个函数,用于将非序列化的对象转换为可序列化的类型。例如,可以指定一个函数来处理自定义对象的序列化。默认情况下,如果遇到无法序列化的对象类型,则引发 。
TypeError
-
sort_keys(默认为 False):如果设置为 True,在输出 JSON 字符串时对键进行排序。默认情况下,这个参数是 False,表示不对键进行排序。
2.json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separors=None, default=None, sort_keys=False, **kw)
:
- 将 Python 对象
obj
序列化为 JSON 格式,并写入文件对象fp
。 - 参数与
dumps
类似。
3.json.loads(s, *, encoding
=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
将 JSON 格式的字符串s 解码为 Python 对象。
-
s:必需参数,要反序列化的 JSON 格式的字符串。
-
encoding(可选):指定 JSON 字符串的编码方式。默认情况下,
json.loads()
将假设输入的 JSON 字符串是使用 UTF-8 编码的。如果 JSON 字符串使用其他编码方式,可以通过这个参数指定编码方式,例如'utf-16'
。 -
cls(可选):用于自定义 JSON 解码器的类。这个参数应该是一个
JSONDecoder
的子类。通过传递自定义的解码器类,可以实现更复杂的 JSON 数据解析逻辑。 -
object_hook(可选):用于在解码 JSON 字符串时,对解析出的字典对象进行自定义处理的回调函数。这个函数将在每个解析出的 JSON 对象转换为 Python 字典之后被调用,可以用于执行额外的处理操作,例如将字典转换为自定义对象。
-
parse_float(可选):用于指定 JSON 字符串中浮点数的解析方式的回调函数。默认情况下,
json.loads()
将使用 Python 的float()
函数解析浮点数。 -
parse_int(可选):用于指定 JSON 字符串中整数的解析方式的回调函数。默认情况下,
json.loads()
将使用 Python 的int()
函数解析整数。 -
parse_constant(可选):用于指定 JSON 字符串中特殊常量(如
null
、true
、false
)的解析方式的回调函数。默认情况下,json.loads()
将使用 Python 的None
、True
和False
来表示这些特殊常量。 -
object_pairs_hook(可选):用于在解码 JSON 字符串时,对解析出的字典对象进行自定义处理的回调函数。与
object_hook
不同的是,这个函数将在每个解析出的 JSON 对象转换为 Python 字典的键值对之后被调用。
4.json.load(fp, *, cls=
None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
- 从文件对象fp 中读取 JSON 数据并解码为 Python 对象
fp
。 - 参数与
loads
类似。
示例:
import json
# 将 Python 对象转换为 JSON 字符串
data = {'name': 'John', 'age': 30, 'city': 'New York'}
json_str = json.dumps(data, indent=2)
print(json_str)
# 将 JSON 字符串转换为 Python 对象
json_data = '{"name": "John", "age": 30, "city": "New York"}'
python_obj = json.loads(json_data)
print(python_obj)
- 在第一个部分中,
json.dumps()
用于将 Python 字典data
转换为格式化良好的 JSON 字符串,然后使用print()
打印输出。 - 在第二个部分中,
json.loads()
用于将 JSON 字符串json_data
反序列化为 Python 对象,并将结果存储在变量python_obj
中。然后同样使用print()
打印输出这个 Python 对象。
这个代码演示了在将数据从 Python 对象转换为 JSON 字符串(序列化)和从 JSON 字符串转换回 Python 对象(反序列化)的基本操作。
import json
# 定义一个 Python 字典对象
data = {
'name': 'John',
'age': 30,
'city': 'New York'
}
# 将字典对象保存到 JSON 文件中
with open('data.json', 'w') as f:
json.dump(data, f)
# 从 JSON 文件中加载数据
with open('data.json', 'r') as f:
loaded_data = json.load(f)
print(loaded_data) # 输出: {'name': 'John', 'age': 30, 'city': 'New York'}
在这个例子中:
- 首先定义了一个简单的 Python 字典
data
,其中包含了一些基本的用户信息。 - 然后,使用
json.dump()
将这个字典对象保存到名为data.json
的文件中。通过传递文件对象和字典对象作为参数,json.dump()
将字典对象转换为 JSON 格式的字符串,并将其写入文件中。 - 接着,使用
json.load()
从data.json
文件中加载数据。json.load()
从文件中读取 JSON 格式的数据,并将其转换为 Python 对象。 - 最后,打印加载的数据,验证它与原始字典对象相同。
这个例子展示了如何使用json.dump()
将 Python 对象保存到 JSON 文件中,以及如何使用json.load()
从 JSON 文件中加载数据并将其转换回 Python 对象。