目录
json.dump()
是 Python 中 json
模块用于将 Python 数据结构序列化为 JSON 格式并写入文件的方法。它提供了多个参数,用于控制序列化的行为和输出格式。以下是 json.dump()
的参数及其说明:
json.dump()
的语法
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
参数说明
1. obj
- 类型:任何可序列化的 Python 数据结构(如字典、列表、字符串、数字等)。
- 说明:这是需要被序列化为 JSON 格式的 Python 对象。
2. fp
- 类型:文件对象。
- 说明:必须是一个支持
.write()
方法的文件对象,通常是通过open()
函数以文本模式('w'
或'a'
)打开的文件。
3. skipkeys
- 类型:布尔值,默认为
False
。 - 说明:
- 如果设置为
True
,则在序列化字典时,会跳过那些键不是基本类型(如字符串、数字、元组等)的键值对。 - 如果设置为
False
,则会抛出TypeError
异常,提示键不可序列化。
- 如果设置为
4. ensure_ascii
- 类型:布尔值,默认为
True
。 - 说明:
- 如果设置为
True
,则输出的 JSON 字符串中所有非 ASCII 字符都会被转义为 Unicode 转义序列(如\uXXXX
)。 - 如果设置为
False
,则会直接输出非 ASCII 字符(如中文、日文等),这在处理国际化数据时非常有用。
- 如果设置为
5. check_circular
- 类型:布尔值,默认为
True
。 - 说明:
- 如果设置为
True
,则在序列化过程中会检查对象是否包含循环引用(即对象引用自身)。如果发现循环引用,会抛出ValueError
异常。 - 如果设置为
False
,则不会进行循环引用检查,但可能会导致程序崩溃或无限递归。
- 如果设置为
6. allow_nan
- 类型:布尔值,默认为
True
。 - 说明:
- 如果设置为
True
,则允许序列化float('nan')
、float('inf')
和float('-inf')
等特殊浮点值。 - 如果设置为
False
,则会抛出ValueError
异常,提示这些值不可序列化。
- 如果设置为
7. cls
- 类型:类,默认为
None
。 - 说明:
- 指定一个自定义的 JSON 编码器类。如果需要自定义序列化逻辑,可以继承
json.JSONEncoder
并重写其方法。 - 如果未指定,则使用默认的
json.JSONEncoder
。
- 指定一个自定义的 JSON 编码器类。如果需要自定义序列化逻辑,可以继承
8. indent
- 类型:整数或字符串,默认为
None
。 - 说明:
- 用于控制输出的 JSON 字符串的缩进格式。
- 如果设置为整数,则表示缩进的空格数(例如
indent=4
表示每级缩进 4 个空格)。 - 如果设置为字符串,则表示缩进的字符(例如
indent="\t"
表示每级缩进一个制表符)。 - 如果设置为
None
,则输出的 JSON 字符串不会进行格式化,而是紧凑的单行输出。
9. separators
- 类型:元组,默认为
None
。 - 说明:
- 指定 JSON 数据中键值对和数组元素之间的分隔符。
- 默认值为
(', ', ': ')
,即键值对之间用逗号和空格分隔,键和值之间用冒号和空格分隔。 - 如果需要紧凑的输出,可以设置为
(',', ':')
,去掉多余的空格。
10. default
- 类型:函数,默认为
None
。 - 说明:
- 指定一个函数,用于处理无法直接序列化的对象。
- 当
json.dump()
遇到无法序列化的对象时,会调用这个函数,并将对象作为参数传入。该函数需要返回一个可序列化的值。
11. sort_keys
- 类型:布尔值,默认为
False
。 - 说明:
- 如果设置为
True
,则在序列化字典时,会按照键的字典序对键值对进行排序。 - 如果设置为
False
,则不会对键值对进行排序,保持原始顺序。
- 如果设置为
示例代码
基本用法
import json
data = {
"name": "Alice",
"age": 25,
"city": "New York",
"hobbies": ["reading", "traveling", "coding"]
}
# 将数据写入 JSON 文件
with open("data.json", "w", encoding="utf-8") as file:
json.dump(data, file, ensure_ascii=False, indent=4)
生成的 data.json
文件内容:
{
"name": "Alice",
"age": 25,
"city": "New York",
"hobbies": [
"reading",
"traveling",
"coding"
]
}
使用 indent
和 separators
import json
data = {
"name": "Alice",
"age": 25,
"city": "New York"
}
# 紧凑格式输出
with open("data.json", "w", encoding="utf-8") as file:
json.dump(data, file, separators=(',', ':'))
# 格式化输出
with open("data_pretty.json", "w", encoding="utf-8") as file:
json.dump(data, file, indent=4)
生成的 data.json
文件内容(紧凑格式):
{"name":"Alice","age":25,"city":"New York"}
生成的 data_pretty.json
文件内容(格式化输出):
{
"name": "Alice",
"age": 25,
"city": "New York"
}
使用 default
参数
假设有一个包含日期对象的字典:
import json
from datetime import datetime
data = {
"name": "Alice",
"birthday": datetime(1995, 5, 15)
}
# 自定义序列化函数
def serialize_datetime(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Type {type(obj)} is not serializable")
# 将数据写入 JSON 文件
with open("data.json", "w", encoding="utf-8") as file:
json.dump(data, file, default=serialize_datetime, indent=4)
生成的 data.json
文件内容:
{
"name": "Alice",
"birthday": "1995-05-15T00:00:00"
}
总结
json.dump()
是一个功能强大的方法,用于将 Python 数据结构序列化为 JSON 格式并写入文件。- 它提供了丰富的参数,用于控制序列化的行为和输出格式,例如
ensure_ascii
、indent
、separators
和default
等。 - 通过合理使用这些参数,可以满足各种复杂的序列化需求。