杰瑞科技汇

Python dict 如何转 JSON?

下面我将从基础到高级,详细讲解如何进行转换。

核心方法:json.dumps()

json 模块提供了 dumps() (dump string) 函数,专门用于将 Python 对象(如字典)转换为 JSON 格式的字符串。

基础转换

这是最简单的用法,适用于字典中的所有键都是字符串,且所有值都是 JSON 支持的基本数据类型(如 str, int, float, bool, list, dict, None)。

import json
# 一个标准的 Python 字典
my_dict = {
    "name": "张三",
    "age": 30,
    "is_student": False,
    "courses": ["数学", "物理"],
    "address": {
        "city": "北京",
        "district": "海淀区"
    },
    "phone": None
}
# 使用 json.dumps() 将字典转换为 JSON 字符串
json_string = json.dumps(my_dict)
print(json_string)

输出:

{"name": "张三", "age": 30, "is_student": false, "courses": ["数学", "物理"], "address": {"city": "北京", "district": "海淀区"}, "phone": null}

注意:

  • Python 的 True/False 在 JSON 中对应 true/false(小写)。
  • Python 的 None 在 JSON 中对应 null
  • JSON 的键(key)必须是双引号包裹的字符串。json.dumps() 会自动处理这一点。

格式化输出(美化 JSON)

默认情况下,json.dumps() 输出的 JSON 字符串是压缩在一行的,可读性较差,你可以使用 indent 参数来美化输出,使其格式化。

import json
my_dict = {
    "name": "李四",
    "age": 25,
    "skills": ["Python", "Java", "SQL"]
}
# 使用 indent=4 进行美化,缩进为4个空格
pretty_json_string = json.dumps(my_dict, indent=4, ensure_ascii=False)
print(pretty_json_string)

输出:

{
    "name": "李四",
    "age": 25,
    "skills": [
        "Python",
        "Java",
        "SQL"
    ]
}

重要参数:ensure_ascii=False 默认情况下,json.dumps() 会将所有非 ASCII 字符(如中文)转义成 \u 形式,为了在 JSON 字符串中直接显示中文,你需要设置 ensure_ascii=False


处理中文和编码问题

当你需要将 JSON 字符串写入文件时,编码问题就变得非常重要,推荐使用 UTF-8 编码。

1 写入文件(json.dump()

json 模块还有一个 dump() (dump) 函数,它可以直接将 Python 对象写入到文件中,无需先转换为字符串,这个方法更高效。

import json
my_dict = {
    "name": "王五",
    "city": "上海"
}
# 使用 'w' 模式打开文件,并指定 encoding='utf-8'
with open('data.json', 'w', encoding='utf-8') as f:
    # dump() 函数可以直接写入文件
    # indent=4 用于美化,ensure_ascii=False 用于保证中文正常显示
    json.dump(my_dict, f, indent=4, ensure_ascii=False)
print("JSON 文件已成功创建。")

执行后,会生成一个名为 data.json 的文件,内容如下:

{
    "name": "王五",
    "city": "上海"
}

处理非 JSON 原生类型

如果你的字典中包含了 JSON 不直接支持的数据类型(datetime 对象),json.dumps() 会直接报错。

import json
from datetime import datetime
my_dict = {
    "event": "产品发布会",
    "time": datetime.now()  # datetime 对象
}
try:
    json.dumps(my_dict)
except TypeError as e:
    print(f"错误: {e}")

输出:

错误: Object of type datetime is not JSON serializable

解决方案:自定义 default 函数 你可以通过 json.dumps()default 参数,传入一个函数来处理这些特殊类型,这个函数会接收一个非 JSON 原生的对象,并返回一个 JSON 可以表示的值(如字符串)。

import json
from datetime import datetime
my_dict = {
    "event": "产品发布会",
    "time": datetime.now()
}
# 定义一个处理特殊类型的函数
def custom_serializer(obj):
    if isinstance(obj, datetime):
        # 将 datetime 对象转换为 ISO 格式的字符串
        return obj.isoformat()
    # 如果不是已知类型,抛出 TypeError
    raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# 使用 default 参数传入自定义函数
json_string = json.dumps(my_dict, default=custom_serializer, ensure_ascii=False)
print(json_string)

输出(示例):

{"event": "产品发布会", "time": "2025-10-27T10:30:00.123456"}

总结与常用参数

函数 功能 常用参数
json.dumps(obj) 将 Python 对象转换为 JSON 字符串 indent: 缩进空格数,用于美化。
ensure_ascii: 是否将非 ASCII 字符转义,设为 False 可正常显示中文。
default: 一个函数,用于处理无法序列化的对象。
json.dump(obj, fp) 将 Python 对象写入到文件对象 fp 参数与 dumps 相同,多了一个文件对象参数 fp

完整示例

import json
from datetime import datetime
# 1. 定义一个包含多种数据类型的字典
data = {
    "id": 101,
    "user_name": "Charlie",
    "is_active": True,
    "scores": [88, 92, 76],
    "profile": {
        "email": "charlie@example.com",
        "signup_date": datetime(2025, 1, 15)
    }
}
# 2. 定义一个自定义序列化器,处理 datetime 类型
def handle_datetime(obj):
    if isinstance(obj, datetime):
        return obj.strftime('%Y-%m-%d %H:%M:%S')
    raise TypeError(f"Type {type(obj)} not serializable")
# 3. 将字典转换为格式化的 JSON 字符串
# 使用 indent=4 美化,ensure_ascii=False 保留中文,default 处理特殊类型
json_str = json.dumps(data, indent=4, ensure_ascii=False, default=handle_datetime)
print("--- 转换后的 JSON 字符串 ---")
print(json_str)
# 4. 将 JSON 字符串写入到文件
with open('user_profile.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=4, ensure_ascii=False, default=handle_datetime)
print("\n--- JSON 文件已成功生成 user_profile.json ---")

这个例子涵盖了从基本转换、美化、处理中文到处理自定义类型(datetime)以及写入文件的完整流程,是实际开发中非常实用的代码。

分享:
扫描分享到社交APP
上一篇
下一篇