pin_drop当前位置:知识文库 ❯ 图文
Python json.dumps详解 - 序列化参数与格式化技巧
一、概述
json.dumps() 是 json 模块中将 Python 对象序列化为 JSON 格式字符串的函数。函数名中的 "dumps" 代表 "dump string",即将数据转储为字符串。dumps() 支持丰富的参数选项,可以控制输出格式、编码方式、自定义序列化逻辑等,是 JSON 编码中最灵活的函数。
二、语法
代码示例
import json
json_str = 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)三、参数说明
四、返回值
返回 JSON 格式的 str。
五、代码示例
示例1:基本序列化与格式化
代码示例
import json
data = {
"name": "张三",
"age": 25,
"hobbies": ["编程", "阅读"],
"active": True,
}
# 默认输出(ASCII转义)
print("默认输出:")
print(json.dumps(data))
# 保留中文
print("\n保留中文:")
print(json.dumps(data, ensure_ascii=False))
# 美化输出
print("\n美化输出(indent=2):")
print(json.dumps(data, ensure_ascii=False, indent=2))
# 紧凑输出
print("\n紧凑输出:")
print(json.dumps(data, ensure_ascii=False, separators=(',', ':')))输出:
代码示例
默认输出:
{"name": "\u5f20\u4e09", "age": 25, "hobbies": ["\u7f16\u7a0b", "\u9605\u8bfb"], "active": true}
保留中文:
{"name": "张三", "age": 25, "hobbies": ["编程", "阅读"], "active": true}
美化输出(indent=2):
{
"name": "张三",
"age": 25,
"hobbies": [
"编程",
"阅读"
],
"active": true
}
紧凑输出:
{"name":"张三","age":25,"hobbies":["编程","阅读"],"active":true}示例2:排序与特殊值处理
代码示例
import json
data = {"zebra": 1, "apple": 2, "mango": 3}
# 按键排序
print("排序输出:")
print(json.dumps(data, sort_keys=True))
# 特殊浮点值
special = {"value": float('nan'), "inf": float('inf'), "ninf": float('-inf')}
# 允许NaN(默认)
print("\n允许NaN:")
print(json.dumps(special, allow_nan=True))
# 禁止NaN(引发ValueError)
try:
json.dumps(special, allow_nan=False)
except ValueError as e:
print(f"\n禁止NaN: {e}")输出:
代码示例
排序输出:
{"apple": 2, "mango": 3, "zebra": 1}
允许NaN:
{"value": NaN, "inf": Infinity, "ninf": -Infinity}
禁止NaN: Out of range float values are not JSON compliant示例3:自定义序列化函数
代码示例
import json
from datetime import datetime, date
def custom_default(obj):
"""自定义序列化函数,处理不支持的类型"""
if isinstance(obj, (datetime, date)):
return obj.isoformat()
elif isinstance(obj, set):
return list(obj)
elif isinstance(obj, bytes):
return obj.decode('utf-8')
raise TypeError(f"Object of type {type(obj).__name__} is not JSON serializable")
# 包含特殊类型的数据
data = {
"created_at": datetime(2024, 1, 15, 14, 30, 0),
"birthday": date(2000, 6, 15),
"tags": {"python", "json", "api"},
"data": b"hello",
}
# 使用default参数
result = json.dumps(data, ensure_ascii=False, default=custom_default, indent=2)
print(result)输出:
代码示例
{
"created_at": "2024-01-15T14:30:00",
"birthday": "2000-06-15",
"tags": [
"python",
"json",
"api"
],
"data": "hello"
}六、实际应用场景
-
API 响应构建:将 Python 字典转换为 JSON 字符串作为 HTTP 响应体
-
数据传输:在进程间或网络中传输数据时,将对象序列化为 JSON 字符串
-
调试输出:使用
indent参数美化输出,便于查看复杂数据结构
七、注意事项
注意1:
ensure_ascii=True(默认)会将中文等非 ASCII 字符转义为\uXXXX,处理中文时务必设置为False。
注意2:
allow_nan=True输出的 NaN、Infinity 不符合 JSON 规范(RFC 8259),某些 JSON 解析器可能无法处理。
注意3:
default函数在遇到无法序列化的对象时被调用,应返回可序列化的对象或引发TypeError。
提示:对于频繁的序列化操作,使用
separators=(',', ':')可以减少输出大小,节省网络带宽。
八、相关方法对比
九、小结
-
json.dumps()将 Python 对象序列化为 JSON 字符串,是最常用的 JSON 编码函数 -
关键参数:
ensure_ascii=False(中文)、indent(美化)、sort_keys(排序)、default(自定义序列化) -
使用
separators=(',', ':')可生成最紧凑的 JSON 输出 -
不支持的类型可通过
default参数或自定义JSONEncoder处理
十、练习题
练习1
编写一个函数 to_json(obj, pretty=False),当 pretty=True 时输出美化格式,否则输出紧凑格式。
练习2
编写一个自定义 default 函数,支持序列化 decimal.Decimal、datetime、set 和 bytes 类型。
练习3
编写一个函数,比较 json.dumps() 在不同 indent 值(None、2、4)和不同 separators 下的输出大小差异。
小贴士
"dumps" 中的 "s" 代表 "string",同理 "loads" 中的 "s" 也代表 "string"。这种命名方式源自 Python 的 pickle 模块约定。当需要处理超大对象时,dumps() 会先在内存中构建完整字符串,可能导致内存压力。此时建议使用 dump() 直接写入文件,或使用生成器配合手动流式写入的方式来降低内存峰值。
常见问题
json.dumps() 能序列化 datetime 对象吗?
不能直接序列化。需要通过 default 参数传入自定义转换函数,将 datetime 转为 ISO 格式字符串,或者继承 json.JSONEncoder 实现自定义编码器。
separators=(',', ':') 有什么作用?
默认的 separators 是 (', ', ': '),包含空格。使用 (',', ':') 可以去掉空格,生成最紧凑的 JSON 字符串,减少数据传输大小,节省网络带宽。
为什么 allow_nan=True 输出的 NaN 不符合 JSON 规范?
RFC 8259 JSON 规范不定义 NaN 和 Infinity 值。allow_nan=True 时 Python 输出 JavaScript 风格的 NaN、Infinity,但这些值在其他语言的 JSON 解析器中可能无法识别,导致跨语言解析失败。
如何自定义 JSONEncoder 来处理特殊类型?
继承 json.JSONEncoder 并重写 default() 方法,在其中判断类型并返回可序列化的对象。然后使用 json.dumps(obj, cls=MyEncoder) 或 json.dumps(obj, default=my_func) 来应用。
本文涉及AI创作
内容由AI创作,请仔细甄别