在Python开发的实际场景中,我们经常会遇到接口返回数据、日志内容里包含嵌套在字符串中的JSON数组的情况,这类数据的解析和后续遍历如果处理不当,很容易触发各种异常。很多开发者拿到这类数据后直接尝试遍历,往往会忽略字符串到JSON对象的转换步骤,或者没有考虑嵌套结构的层级问题,导致后续操作失败。

嵌套字符串JSON数组的典型结构
这类数据通常外层是一个普通字符串,内部是符合JSON格式的数组,数组元素可能是对象、字符串或者嵌套的数组,比如下面这种常见格式:
# 嵌套在字符串中的JSON数组示例
raw_data = '[{"id": 1, "name": "商品A", "attrs": {"color": "红", "size": "M"}}, {"id": 2, "name": "商品B", "attrs": {"color": "蓝", "size": "L"}}]'
正确的解析步骤
解析这类数据的核心是先通过json模块把字符串转换为Python可操作的数据类型,再进行后续处理,具体步骤如下:
1. 导入json模块并解析字符串
首先需要使用json.loads()方法将字符串转换为Python的列表对象,这一步要注意捕获解析异常,避免非法JSON格式导致程序崩溃。
import json
raw_data = '[{"id": 1, "name": "商品A", "attrs": {"color": "红", "size": "M"}}, {"id": 2, "name": "商品B", "attrs": {"color": "蓝", "size": "L"}}]'
try:
# 将字符串解析为Python列表
parsed_data = json.loads(raw_data)
print(type(parsed_data)) # 输出 <class 'list'>
except json.JSONDecodeError as e:
print(f"JSON解析失败:{e}")
parsed_data = []
2. 遍历解析后的列表
解析完成后得到的是列表,每个元素是字典对象,这时候可以正常遍历列表获取每个字典的内容。
for item in parsed_data:
print(f"商品ID:{item.get('id')},商品名称:{item.get('name')}")
Python字典遍历的常见陷阱
在处理解析后的字典时,很多开发者会踩到以下典型陷阱:
陷阱1:未判断数据类型直接遍历
如果原始字符串解析后不是预期的列表类型,直接遍历会触发TypeError,比如接口返回异常时可能返回字符串或者空值,需要先做类型校验。
# 错误示例:未判断类型直接遍历
raw_data = '{"error": "数据返回异常"}' # 解析后是字典不是列表
parsed_data = json.loads(raw_data)
for item in parsed_data: # 这里遍历字典会拿到键,不符合预期
print(item)
# 正确做法:先判断类型
if isinstance(parsed_data, list):
for item in parsed_data:
# 处理列表元素
pass
elif isinstance(parsed_data, dict):
print("解析结果是字典,不是预期的列表")
陷阱2:直接访问字典键忽略不存在的情况
使用item['key']的方式访问键,如果键不存在会抛出KeyError,更安全的做法是用get()方法设置默认值。
# 错误示例:直接访问不存在的键
for item in parsed_data:
print(item['price']) # 如果item没有price键会报错
# 正确做法:使用get设置默认值
for item in parsed_data:
price = item.get('price', 0) # 不存在price键时返回0
print(price)
陷阱3:嵌套字典遍历时未处理层级
如果字典内部还有嵌套的字典或者数组,直接遍历外层字典无法拿到深层数据,需要递归或者逐层处理。
# 处理嵌套的attrs字段
for item in parsed_data:
attrs = item.get('attrs', {})
if isinstance(attrs, dict):
color = attrs.get('color', '未知')
size = attrs.get('size', '未知')
print(f"颜色:{color},尺寸:{size}")
陷阱4:遍历过程中修改字典结构
在遍历字典的同时删除或新增键,会导致遍历行为异常,甚至抛出RuntimeError,如果需要修改结构,应该先拷贝字典或者收集需要修改的内容后批量处理。
# 错误示例:遍历时修改字典
for item in parsed_data:
if 'attrs' in item:
del item['attrs'] # 遍历中删除键可能引发异常
# 正确做法:先拷贝再处理
for item in parsed_data.copy():
if 'attrs' in item:
del item['attrs']
总结
解析嵌套在字符串中的JSON数组,核心是先通过json.loads()完成字符串到Python对象的转换,同时做好异常捕获和类型校验。在字典遍历过程中,要注意避免直接访问不存在的键、忽略嵌套层级、遍历时修改结构等常见陷阱,通过类型判断、get()方法、拷贝遍历等方式可以让代码更健壮,减少线上问题的发生。
JSON解析Python字典遍历字符串处理嵌套数据结构修改时间:2026-06-09 01:36:27