如何正确解析嵌套在字符串中的 JSON 数组(Python 字典遍历常见陷阱)

2次阅读

如何正确解析嵌套在字符串中的 JSON 数组(Python 字典遍历常见陷阱)

本文详解当 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 或静默逻辑偏差,提升数据管道的健壮性与可维护性。

text=ZqhQzanResources