Python中List转JSON后如何取值?从转换到取值的完整指南
在Python开发中,List(列表)和JSON(JavaScript Object Notation)是两种常用的数据结构,List是Python原生数据类型,适合存储有序数据;JSON则是轻量级的数据交换格式,广泛应用于前后端数据交互,很多时候我们需要将List转换为JSON格式(例如通过API发送数据),转换后又需要从JSON中取出特定值,本文将详细介绍List转JSON的方法,以及转换后如何高效取值,包含常见场景和代码示例。
List转JSON:基础方法与注意事项
核心工具:json模块
Python内置了json模块,提供了dumps()方法用于将Python对象(如List)转换为JSON格式的字符串,基本语法如下:
import json
python_list = [1, "apple", {"name": "Alice"}, [3, 4]]
json_str = json.dumps(python_list)
print(json_str) # 输出: [1, "apple", {"name": "Alice"}, [3, 4]]
关键参数:格式化与编码
indent:缩进参数,使JSON字符串更易读(常用于调试或配置文件)json_str = json.dumps(python_list, indent=2) # 输出带缩进的JSON: # [ # 1, # "apple", # { # "name": "Alice" # }, # [ # 3, # 4 # ] # ]ensure_ascii:默认为True,非ASCII字符(如中文)会转义为\u格式;设为False可保留原字符list_with_chinese = ["苹果", {"city": "北京"}] json_str = json.dumps(list_with_chinese, ensure_ascii=False) print(json_str) # 输出: ["苹果", {"city": "北京"}]
常见错误:类型不匹配
json.dumps()支持Python原生类型(如dict、list、str、int、float、bool、None),但无法直接处理自定义对象或特殊类型(如datetime),若需转换复杂类型,需通过default参数自定义序列化逻辑:
from datetime import datetime
def handle_datetime(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
data = [datetime.now(), "当前时间"]
json_str = json.dumps(data, default=handle_datetime)
print(json_str) # 输出: ["2023-10-01T12:00:00", "当前时间"]
List转JSON后如何取值?3种核心场景
List转换为JSON字符串后,本质是一个字符串格式的列表结构,取值前需先将JSON字符串解析为Python对象(通常是list或dict),再通过索引、键或遍历操作取值,以下是常见场景及方法:
场景1:JSON是“纯列表结构”(无嵌套字典)
如果List本身是简单列表(如[1, 2, 3])或嵌套列表(如[[1, 2], [3, 4]]),转换后的JSON可直接通过索引取值。
示例:简单列表取值
import json # 原始List simple_list = [10, 20, 30, 40] json_str = json.dumps(simple_list) # 转为JSON字符串: "[10, 20, 30, 40]" # 1. 解析为Python列表 parsed_list = json.loads(json_str) # parsed_list = [10, 20, 30, 40] # 2. 通过索引取值 print(parsed_list[0]) # 输出: 10 print(parsed_list[-1]) # 输出: 40 print(parsed_list[1:3]) # 输出: [20, 30] # 支持切片
示例:嵌套列表取值
nested_list = [[1, 2], [3, 4], {"a": 5}]
json_str = json.dumps(nested_list)
parsed_list = json.loads(json_str)
# 取嵌套列表中的元素
print(parsed_list[0][1]) # 输出: 2(第一个子列表的第二个元素)
print(parsed_list[2]["a"]) # 输出: 5(第三个元素是字典,通过键取值)
场景2:JSON是“列表嵌套字典结构”(最常见)
实际开发中,List常存储字典(如[{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]),转换后需通过“索引+键”组合取值。
示例:基础取值
import json
# 原始List(列表元素为字典)
data = [
{"id": 1, "name": "Alice", "age": 25},
{"id": 2, "name": "Bob", "age": 30},
{"id": 3, "name": "Charlie", "age": 35}
]
json_str = json.dumps(data)
parsed_data = json.loads(json_str) # parsed_data是列表,元素是字典
# 1. 取第一个字典的"name"值
print(parsed_data[0]["name"]) # 输出: Alice
# 2. 取最后一个字典的"id"值
print(parsed_data[-1]["id"]) # 输出: 3
# 3. 取第二个字典的"age"值
print(parsed_data[1]["age"]) # 输出: 30
示例:遍历列表取所有值
需循环遍历列表,再通过键取字典中的值:
# 遍历所有用户的名字
for item in parsed_data:
print(item["name"]) # 依次输出: Alice, Bob, Charlie
# 遍历所有用户的id和年龄
for item in parsed_data:
print(f"ID: {item['id']}, Age: {item['age']}")
# 输出:
# ID: 1, Age: 25
# ID: 2, Age: 30
# ID: 3, Age: 35
场景3:JSON是“复杂嵌套结构”(列表+字典+列表)
当List中嵌套多层字典和列表时(如[{"user": "Alice", "orders": [{"id": 101}, {"id": 102}]}]),需通过“索引+键+索引”的链式方式取值。
示例:多层嵌套取值
import json
# 复杂嵌套List
complex_data = [
{
"user": "Alice",
"orders": [
{"id": 101, "amount": 50},
{"id": 102, "amount": 30}
],
"address": {"city": "Beijing", "street": "Main St"}
},
{
"user": "Bob",
"orders": [
{"id": 103, "amount": 80}
],
"address": {"city": "Shanghai", "street": "Park Ave"}
}
]
json_str = json.dumps(complex_data)
parsed_data = json.loads(json_str)
# 1. 取第一个用户的订单列表
orders = parsed_data[0]["orders"] # orders = [{"id": 101, "amount": 50}, {"id": 102, "amount": 30}]
print(orders) # 输出: [{'id': 101, 'amount': 50}, {'id': 102, 'amount': 30}]
# 2. 取第一个用户的第一个订单的id
first_order_id = parsed_data[0]["orders"][0]["id"]
print(first_order_id) # 输出: 101
# 3. 取第二个用户的地址城市
second_user_city = parsed_data[1]["address"]["city"]
print(second_user_city) # 输出: Shanghai
# 4. 遍历所有用户的订单金额
for user in parsed_data:
print(f"User: {user['user']}")
for order in user["orders"]:
print(f" Order ID: {order['id']}, Amount: {order['amount']}")
# 输出:
# User: Alice
# Order ID: 101, Amount: 50
# Order ID: 102, Amount: 30
# User: Bob
# Order ID: 103, Amount: 80



还没有评论,来说两句吧...