
本文详解当 python 字典的值意外为 json 格式字符串(而非原生数据结构)时,如何通过 json.loads() 安全转换并遍历其中的字典列表,避免将字符串误当作可迭代容器直接索引。
本文详解当 python 字典的值意外为 json 格式字符串(而非原生数据结构)时,如何通过 json.loads() 安全转换并遍历其中的字典列表,避免将字符串误当作可迭代容器直接索引。
在实际数据处理中,尤其是从配置文件、API 响应或旧版序列化格式读取数据时,常会遇到一种“伪嵌套”结构:表面看是字典套列表再套字典,实则内层数据被双重封装——外层是 Python 字典,但其值是JSON 格式的字符串,而非已解析的 Python 对象。这正是问题中 data["test"] 的典型表现:
data = {
"test": ['[{"Day":"Monday","Device":"Android","Data":[1, 2, 3]}, {"Day":"Tuesday","Device":"Iphone","Data":[10, 20, 30]}]']
}注意:data["test"] 是一个单元素列表,其唯一元素 value[0] 是一个字符串(以 '[' 开头),而非真正的 list。因此执行 value1[0] 得到的是字符串的第一个字符 '[',而非第一个 JSON 对象——这是根本性类型误判。
✅ 正确做法是:先用 json.loads() 将该 JSON 字符串反序列化为原生 Python 列表,再进行迭代:
import json
# 提取并解析嵌套的 JSON 字符串
json_string = data["test"][0] # 类型: str
parsed_list = json.loads(json_string) # 类型: list[dict]
# 现在可安全遍历字典列表
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'>
? 关键要点总结:
- 不要跳过解析步骤:data["test"][0] 是字符串,必须经 json.loads() 转换后才具备 list 行为;
-
验证输入安全性:若 JSON 字符串来源不可信,建议添加异常处理:
try: parsed_list = json.loads(json_string) except json.JSONDecodeError as e: raise ValueError(f"Invalid JSON in data['test']: {e}") - 警惕双重封装模式:类似 ["[{...}, {...}]"] 或 {"key": "[{...}]"} 是常见反模式,应在数据摄入阶段(如 json.load(file) 或 requests.json())确保一次性解析到位,而非依赖后续手动 loads;
- 类型检查辅助调试:开发期可插入 print(type(x)) 快速定位“本该是 list/dict 却是 str”的陷阱。
掌握这一解析范式,能有效规避因数据序列化层级错位导致的索引错误、KeyError 或静默逻辑偏差,提升数据管道的健壮性与可维护性。










