杰瑞科技汇

Python list 如何转 json?

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

Python list 如何转 json?-图1
(图片来源网络,侵删)

核心方法: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 list 如何转 json?-图2
(图片来源网络,侵删)
原始 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() 并配合 indentensure_ascii=False 就能很好地完成列表到 JSON 的转换。

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