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)

三、参数说明

参数 类型 默认值 说明
obj 任意 必填 要序列化的Python对象
skipkeys bool False 为True时跳过非字符串键,而非引发TypeError
ensure_ascii bool True 为True时转义非ASCII字符;为False时原样输出
check_circular bool True 为True时检查循环引用
allow_nan bool True 为True时允许NaN、Infinity、-Infinity
cls type None 自定义JSONEncoder子类
indent int/str None 缩进空格数或字符串,用于美化输出
separators tuple (', ', ': ') 元素和键值分隔符
default callable None 不可序列化对象的转换函数
sort_keys bool False 为True时按键排序输出

四、返回值

返回 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 参数美化输出,便于查看复杂数据结构


七、注意事项

注意1ensure_ascii=True(默认)会将中文等非 ASCII 字符转义为 \uXXXX,处理中文时务必设置为 False

注意2allow_nan=True 输出的 NaN、Infinity 不符合 JSON 规范(RFC 8259),某些 JSON 解析器可能无法处理。

注意3default 函数在遇到无法序列化的对象时被调用,应返回可序列化的对象或引发 TypeError

提示:对于频繁的序列化操作,使用 separators=(',', ':') 可以减少输出大小,节省网络带宽。


八、相关方法对比

特性 json.dumps() json.dump() str() repr()
输出格式 JSON标准 JSON标准 Python格式 Python格式
输出类型 str 写入文件 str str
中文处理 ensure_ascii控制 ensure_ascii控制 原样输出 原样输出
格式化 indent参数 indent参数
跨语言
适用场景 API/网络传输 文件存储 调试 调试

九、小结

  • 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.Decimaldatetimesetbytes 类型。

练习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) 来应用。

标签: json.dumps 序列化 JSON编码 ensure_ascii default参数 JSONEncoder

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python json模块详解 - 序列化与解码入门教程 下一篇: Python json.loads详解 - JSON解码与自定义解析技巧

poll相关推荐