【Pyhton】Json.dump 语法说明

发布于:2025-07-08 ⋅ 阅读:(12) ⋅ 点赞:(0)

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

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"
    ]
}

使用 indentseparators

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_asciiindentseparatorsdefault 等。
  • 通过合理使用这些参数,可以满足各种复杂的序列化需求。

网站公告

今日签到

点亮在社区的每一天
去签到