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

核心方法:json.dumps()
要将 Python 对象(包括列表)转换为 JSON 字符串,你需要使用 json 模块中的 dumps() 函数。dumps 是 "dump string" 的缩写。
基本语法:
import json json_string = json.dumps(python_object)
简单列表的转换
对于一个只包含基本数据类型(如字符串、数字、布尔值、None)的列表,转换非常直接。
import json
# 一个简单的 Python 列表
my_list = ['apple', 'banana', 123, True, None]
# 将列表转换为 JSON 字符串
json_string = json.dumps(my_list)
print(f"原始 Python 列表: {my_list}")
print(f"转换后的 JSON 字符串: {json_string}")
print(f"数据类型: {type(json_string)}")
输出:

原始 Python 列表: ['apple', 'banana', 123, True, None]
转换后的 JSON 字符串: ["apple", "banana", 123, true, null]
数据类型: <class 'str'>
注意:
- Python 的
True会被转换为 JSON 的true。 - Python 的
False会被转换为 JSON 的false。 - Python 的
None会被转换为 JSON 的null。 - JSON 的字符串必须使用双引号 ,而 Python 列表可以接受单引号 。
json.dumps()会自动处理这个差异。
复杂列表的转换(包含字典)
当列表中包含字典或其他列表时(即嵌套结构),json.dumps() 同样能很好地处理。
import json
# 一个包含字典的复杂列表
data = [
{"name": "Alice", "age": 30, "is_student": False},
{"name": "Bob", "age": 25, "is_student": True, "courses": ["Math", "Science"]},
"This is a string in the list"
]
# 转换为 JSON 字符串
json_string = json.dumps(data)
print(json_string)
输出:
[
{"name": "Alice", "age": 30, "is_student": false},
{"name": "Bob", "age": 25, "is_student": true, "courses": ["Math", "Science"]},
"This is a string in the list"
]
可以看到,整个 Python 列表被转换成了一个格式良好的 JSON 数组,其中的字典也相应地转换为了 JSON 对象。
格式化输出(美化 JSON)
默认情况下,json.dumps() 输出的字符串是压缩的,没有多余的空格和换行,如果希望输出更易读的格式(例如用于调试或展示),可以使用 indent 参数。
import json
data = [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
]
# 不进行格式化
json_compact = json.dumps(data)
print("紧凑格式:")
print(json_compact)
# 使用 indent=2 进行格式化,缩进2个空格
json_pretty = json.dumps(data, indent=2)
print("\n美化格式:")
print(json_pretty)
输出:
紧凑格式:
[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]
美化格式:
[
{
"name": "Alice",
"age": 30
},
{
"name": "Bob",
"age": 25
}
]
处理非 ASCII 字符(如中文)
默认情况下,json.dumps() 会将非 ASCII 字符(如中文)进行转义。"你好" 会被变成 "\u4f60\u597d",如果你希望直接输出中文字符,可以设置 ensure_ascii=False。
import json
data = ["你好", "世界", "Python"]
# 默认行为(转义非ASCII字符)
json_escaped = json.dumps(data)
print("默认转义:")
print(json_escaped)
# 直接显示中文字符
json_chinese = json.dumps(data, ensure_ascii=False)
print("\n直接显示中文:")
print(json_chinese)
输出:
默认转义:
["\u4f60\u597d", "\u4e16\u754c", "Python"]
直接显示中文:
["你好", "世界", "Python"]
在处理中文或其他非英文内容时,强烈建议设置 ensure_ascii=False。
其他常用参数
json.dumps() 还有一些其他有用的参数:
separators: 自定义分隔符,默认是 (元素间用逗号和空格,键值间用冒号和空格),如果你想生成更小的 JSON 文件,可以去掉空格:separators=(',', ':')。sort_keys: 对 JSON 对象的键进行排序,当你需要生成一致的输出时(例如用于哈希校验),这个参数很有用。
示例:
import json
data = {"name": "Bob", "age": 25, "city": "Beijing"}
# 生成最小化的 JSON
json_minified = json.dumps(data, separators=(',', ':'), ensure_ascii=False)
print("最小化 JSON:")
print(json_minified)
# 对键进行排序
json_sorted = json.dumps(data, sort_keys=True, indent=2, ensure_ascii=False)
print("\n键排序后的美化 JSON:")
print(json_sorted)
输出:
最小化 JSON:
{"name":"Bob","age":25,"city":"Beijing"}
键排序后的美化 JSON:
{
"age": 25,
"city": "Beijing",
"name": "Bob"
}
常见错误及解决
错误:TypeError: Object of type ... is not JSON serializable
这个错误通常发生在你的列表中包含了 json 模块无法直接序列化的 Python 对象,
- 自定义类的实例 (
class MyClass: ...) - 日期时间对象 (
datetime.datetime) - 集合 (
set)
解决方案:使用 default 参数
你可以提供一个自定义的函数,通过 default 参数告诉 json.dumps() 如何处理这些特殊对象,这个函数会接收一个无法序列化的对象,并返回一个可以被 JSON 序列化的 Python 基本类型。
示例:序列化 datetime 对象
import json
from datetime import datetime
# 一个包含 datetime 对象的列表
data = ["event", datetime.now()]
# 定义一个处理 datetime 对象的函数
def datetime_handler(obj):
if isinstance(obj, datetime):
return obj.isoformat() # 将 datetime 转换为 ISO 格式的字符串
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
try:
# 不提供 default 函数会报错
# json.dumps(data)
print(json.dumps(data, default=datetime_handler, ensure_ascii=False))
except TypeError as e:
print(e)
输出:
["event", "2025-10-27T10:30:00.123456"]
| 任务 | 函数/方法 | 描述 |
|---|---|---|
| 列表转 JSON 字符串 | json.dumps(my_list) |
核心方法,将 Python 对象转为 JSON 格式的字符串。 |
| 美化输出 | json.dumps(data, indent=4) |
使用 indent 参数使 JSON 字符串更易读。 |
| 处理中文 | json.dumps(data, ensure_ascii=False) |
使用 ensure_ascii=False 直接输出非 ASCII 字符。 |
| 处理自定义对象 | json.dumps(data, default=my_handler) |
使用 default 参数提供一个函数来处理无法序列化的对象。 |
| JSON 字符串转列表 | json.loads(json_string) |
反向操作,将 JSON 字符串解析回 Python 列表。 |
对于绝大多数情况,你只需要记住 json.dumps() 并配合 indent 和 ensure_ascii=False 就能很好地完成列表到 JSON 的转换。
