Python字典和列表怎么转换为JSON字符串

小满
小满
发布时间:2026-11-14 | 7人浏览过
原创

详细讲解在Python中如何使用标准库json模块将字典和列表转换为标准的JSON字符串,涵盖json.dumps的基本用法、中文编码处理、格式化美化及常见报错解决方法。

在 Python 中将字典(dict)或列表(list)转换为 JSON 格式的字符串,核心方法是使用内置的标准库 json 中的 json.dumps() 函数。Python 字典在转换后对应 JSON 的“对象”(以大括号包裹的键值对),列表则对应 JSON 的“数组”(以方括号包裹的有序序列)。整个过程无需安装任何第三方库,只需导入模块并传入目标对象即可完成序列化。

Python字典和列表怎么转换为JSON字符串
图 1:Python 原生数据结构与 JSON 标准数据类型的映射对照

一、基础转换:使用 json.dumps()

json.dumps() 中的 s 代表 string,意思是将内存中的 Python 对象“转储”(dump)为一个普通的字符串。无论是字典还是列表,调用方式都完全统一。

1. 字典转换为 JSON 字符串

字典包含键值映射关系。在序列化时,Python 字典的键会自动转为带双引号的 JSON 键,常见的基础数据类型也会同步转为对应格式:

import json

# 定义一个普通的 Python 字典
user_info = {
    "name": "Alex",
    "age": 28,
    "is_active": True,
    "skills": ["Python", "SQL"],
    "profile": None
}

# 转换为 JSON 字符串
json_str = json.dumps(user_info)

print(type(json_str))
print(json_str)

示例输出:

<class 'str'>
{"name": "Alex", "age": 28, "is_active": true, "skills": ["Python", "SQL"], "profile": null}

注意观察转换细节:原始 Python 中的布尔值 True 转换成了 JSON 的小写 true,空值对象 None 转换成了 JSON 的 null,输出结果的外层类型是标准的 str。

2. 列表转换为 JSON 字符串

列表是有序序列。既可以转换纯数值或字符串构成的单一列表,也可以转换在 Web API 开发中最常见的“字典列表”(对象数组):

import json

# 包含字典元素的列表
product_list = [
    {"id": 101, "name": "Keyboard", "price": 199.5},
    {"id": 102, "name": "Mouse", "price": 89.0}
]

# 执行转换
json_array_str = json.dumps(product_list)

print(json_array_str)

示例输出:

[{"id": 101, "name": "Keyboard", "price": 199.5}, {"id": 102, "name": "Mouse", "price": 89.0}]
Python字典和列表怎么转换为JSON字符串
图 2:从 Python 对象到可用 JSON 文本的完整处理流程

二、核心参数控制:格式美化与中文保留

直接调用 json.dumps(data) 时,默认设置偏向于生成紧凑型 ASCII 字符串。在中文环境或需要人工排查日志时,需要配置以下关键参数。

1. 正确输出中文:ensure_ascii=False

默认情况下,ensure_ascii=True 会将所有非 ASCII 字符(包括中文字符)转义为 Unicode 编码转义序列(形如 \u4e2d\u6587)。这虽然符合规范,但严重影响人类阅读。

import json

user_data = {"城市": "北京", "职位": "工程师"}

# 默认行为(转义中文)
default_json = json.dumps(user_data)
print("默认转义:", default_json)

# 保留中文字符
chinese_json = json.dumps(user_data, ensure_ascii=False)
print("保留中文:", chinese_json)

示例输出:

默认转义: {"\u57ce\u5e02": "\u5317\u4eac", "\u804c\u4f4d": "\u5de5\u7a0b\u5e08"}
保留中文: {"城市": "北京", "职位": "工程师"}

2. 格式化缩进排版:indent

默认输出的 JSON 字符串是没有换行和空格的紧凑文本。通过传入 indent 参数(通常指定整数 2 或 4),可以输出带缩进换行的高可读性结构,便于在控制台或文件中查看:

data = {
    "project": "Report",
    "tags": ["python", "json"],
    "version": 1.0
}

pretty_json = json.dumps(data, indent=4, ensure_ascii=False)
print(pretty_json)

示例输出:

{
    "project": "Report",
    "tags": [
        "python",
        "json"
    ],
    "version": 1.0
}

3. 键名排序:sort_keys=True

在接口签名验证、数据比对或单元测试中,确保字典输出的键名按字母顺序排序非常有用:

raw_dict = {"z": 10, "a": 5, "m": 8}
sorted_json = json.dumps(raw_dict, sort_keys=True)
print(sorted_json)  # 输出: {"a": 5, "m": 8, "z": 10}
Python字典和列表怎么转换为JSON字符串
图 3:不同业务场景下的序列化参数选型指南

三、常见错误排查与重要注意事项

1. TypeError: Object of type ... is not JSON serializable

JSON 官方标准只定义了极少的基础类型(数字、字符串、布尔、数组、对象、null)。如果字典或列表中包含了 Python 的其他对象,如 set(集合)、datetime 对象或自定义 Class 实例,执行 json.dumps() 会直接抛出序列化异常。

import json
from datetime import datetime

# 错误示例:包含不可直接序列化的集合和日期
bad_data = {
    "tags": {"python", "coding"},  # set 集合不支持
    "created_at": datetime.now()     # datetime 对象不支持
}

# 解决方案:预先转换类型,或指定 default 参数处理器
def custom_encoder(obj):
    if isinstance(obj, set):
        return list(obj)
    if isinstance(obj, datetime):
        return obj.strftime("%Y-%m-%d %H:%M:%S")
    raise TypeError(f"无法序列化类型: {type(obj)}")

safe_json = json.dumps(bad_data, default=custom_encoder, ensure_ascii=False)
print(safe_json)

2. 明确区分 dumps() 与 dump()

很多初学者容易将 dumps 与 dump 混淆。两者的区别非常直观:

  • json.dumps(obj):带 s,接收对象并返回一个 Python 字符串(str),留在内存中处理。
  • json.dump(obj, fp):不带 s,接收对象和一个文件对象(如通过 open 打开的文件),直接将 JSON 数据写入磁盘文件。
import json

data = {"item": "notebook", "qty": 5}

# 场景 1:获取字符串(本文主题)
json_text = json.dumps(data)

# 场景 2:直接写入本地文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

3. Python 单引号与 JSON 双引号规范

在 Python 语法中,字符串用单引号 'key' 或双引号 "key" 均可;但 JSON 规范强制规定键名和字符串值必须使用双引号 "。永远不要试图使用字符串的 replace("'", '"') 去手工拼凑 JSON,这种做法在遇到文本内部本身带有单引号、双引号或转义字符时极易损坏数据结构,始终应由 json.dumps() 自动转义生成。

Python字典和列表怎么转换为JSON字符串
图 4:序列化开发与排错关键要点汇总

四、方法总结表

需求场景 标准代码写法 输出特性
最简转换(默认) json.dumps(data) 紧凑无换行,中文会转为 ASCII Unicode 编码
保留中文字符 json.dumps(data, ensure_ascii=False) 输出直接显示中文,便于国内接口与日志排查
美化排版与换行 json.dumps(data, indent=4, ensure_ascii=False) 层级缩进对齐,适合本地查看或生成配置文件
去除多余空白字符 json.dumps(data, separators=(',', ':')) 去除冒号与逗号后的默认空格,压缩体积极限
稳定排序输出 json.dumps(data, sort_keys=True) 键名按字典序排序,保证每次序列化结果完全一致

掌握以上 json.dumps() 的调用方式和参数组合,即可在 Python 开发中稳定、高效地完成字典与列表到标准 JSON 字符串的转换处理。

相关专题:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表