
本文详解如何处理因序列化不当导致的“json 字符串嵌套在列表中”的典型数据结构,通过 json.loads() 安全还原为原生 python 对象,并正确遍历字典与子列表。
本文详解如何处理因序列化不当导致的“json 字符串嵌套在列表中”的典型数据结构,通过 json.loads() 安全还原为原生 python 对象,并正确遍历字典与子列表。
在实际开发中(尤其是从配置文件、API 响应或旧版日志中读取数据时),常会遇到一种看似是嵌套字典、实则被双重序列化的数据结构:外层是 Python 字典,内层值却是一个包含 JSON 格式字符串的单元素列表。例如:
data = {
"test": ['[{"Day":"Monday","Device":"Android","Data":[1, 2, 3]}, {"Day":"Tuesday","Device":"Iphone","Data":[10, 20, 30]}]']
}此时 data["test"] 是一个长度为 1 的 Python 列表,而 data["test"][0] 并非列表对象,而是一个JSON 格式的字符串(注意首尾的引号和方括号)。直接对其索引(如 value1[0])只会获取字符串的第一个字符 '[',而非第一个 JSON 对象——这正是问题根源。
✅ 正确做法是:先提取字符串,再用 json.loads() 解析为 Python 原生对象。完整流程如下:
import json
# 1. 获取字符串形式的 JSON 数组
json_str = data["test"][0] # 类型: str
# 2. 解析为 Python 列表(每个元素是 dict)
parsed_list = json.loads(json_str) # 类型: list[dict]
# 3. 安全遍历每个字典项
for item in parsed_list:
print(f"Day: {item['Day']}, Device: {item['Device']}, Data: {item['Data']}")
print(f" → Type: {type(item)}") # 验证已转为 dict输出结果:
立即学习“Python免费学习笔记(深入)”;
Day: Monday, Device: Android, Data: [1, 2, 3] → Type: <class 'dict'> Day: Tuesday, Device: Iphone, Data: [10, 20, 30] → Type: <class 'dict'>
⚠️ 关键注意事项:
- 切勿使用 eval():虽然 eval(data["test"][0]) 可能“凑效”,但存在严重安全风险(执行任意代码),绝对禁止用于不可信输入。
-
务必异常捕获:真实场景中 JSON 字符串可能格式错误,建议包裹 try/except:
try: parsed_list = json.loads(json_str) except json.JSONDecodeError as e: print(f"Invalid JSON string: {e}") raise - 检查数据来源:理想方案是修正上游序列化逻辑(如避免将 JSON 字符串二次存入列表),从根本上杜绝该结构;当前解法属健壮性兜底。
总结:面对 "test": ['[...json...]'] 这类结构,核心思路是「字符串 → JSON 解析 → 原生对象」三步转化。掌握 json.loads() 的精准应用,即可高效、安全地解锁深层嵌套数据,避免误将字符串当容器操作的常见陷阱。










