如何从JSON响应获取2个匹配结果后终止for循环并赋值变量
可行性结论
该需求完全可实现,且实现逻辑简单,还可以做到匹配到足够数量的结果后立刻终止遍历,避免全量扫描数据带来的不必要性能损耗。
原代码的已知问题
- 变量名不统一:JSON加载后赋值给
data变量,列表推导式中却调用了未定义的response变量,运行会直接抛NameError - 类型调用错误:JSON反序列化后
SnapshotCreateTime是字符串类型,直接调用时间对象专属的.strftime()方法会抛AttributeError - 遍历逻辑缺陷:用列表推导式做筛选会遍历完所有快照数据,无法在匹配到2个结果后提前终止
- 变量设计不合理:尝试动态声明N个变量存储结果完全没必要,固定最多取2个结果的场景下,用列表收集结果后按长度解包即可,代码可维护性更高
参考实现代码
import json import sys lookup_dt = "2022-03-09" r = '{"DBClusterSnapshots": [{"DBClusterSnapshotIdentifier": "snap-1", "DBClusterIdentifier": "aurora-cluster", "SnapshotCreateTime": "2022-03-09T03:12:45.123Z", "Engine": "aurora-postgresql", "EngineVersion": "12.7", "SnapshotType": "manual"}, {"DBClusterSnapshotIdentifier": "snap-2", "DBClusterIdentifier": "aurora-cluster", "SnapshotCreateTime": "2022-03-09T08:45:12.456Z", "Engine": "aurora-postgresql", "EngineVersion": "12.7", "SnapshotType": "manual"}, {"DBClusterSnapshotIdentifier": "snap-3", "DBClusterIdentifier": "aurora-cluster", "SnapshotCreateTime": "2022-03-09T11:22:33.789Z", "Engine": "aurora-postgresql", "EngineVersion": "12.7", "SnapshotType": "manual"}]}' data = json.loads(r) matched_snaps = [] # 遍历快照列表,匹配到2个结果直接终止循环 for snap_item in data["DBClusterSnapshots"]: # 兼容带毫秒、时区的ISO时间格式,前10位固定为YYYY-MM-DD格式日期,无需转时间对象 snap_date = snap_item["SnapshotCreateTime"][:10] if snap_date == lookup_dt: matched_snaps.append(snap_item["DBClusterSnapshotIdentifier"]) # 凑够2个结果立刻跳出循环,不再遍历后续数据 if len(matched_snaps) >= 2: break # 按匹配结果数量走对应逻辑 if len(matched_snaps) == 0: print(f"ERROR: Snapshot did not find for requested date : {lookup_dt}") sys.exit(1) elif len(matched_snaps) == 1: SnapshotId = matched_snaps[0] print(f"INFO: Found manual snapshots for requested date: {SnapshotId}") else: SnapshotId, SnapshotId2 = matched_snaps print(f"INFO: Found manual snapshots for requested date: {SnapshotId}, {SnapshotId2}")
逻辑说明
- 日期匹配做了格式兼容:不管接口返回的是纯日期字符串,还是带毫秒、时区的ISO格式时间戳,字符串前10位固定为
YYYY-MM-DD格式,直接和目标日期比对即可,不需要做时间类型转换,性能更高也不会触发类型错误 - 遍历过程中每匹配到一个符合条件的快照ID就存入结果列表,当列表长度达到2时立刻执行
break终止循环,后续的快照数据不会再被遍历 - 结果分支完全匹配需求:
- 无匹配结果:打印错误日志,以状态码1退出程序
- 匹配到1个结果:赋值给单个
SnapshotId变量,打印对应提示 - 匹配到2个及以上结果:只保留最先匹配到的前2个,解包赋值给
SnapshotId和SnapshotId2两个变量,打印对应提示
内容的提问来源于stack exchange,提问作者Rj_N
相关产品推荐
相关产品推荐

