Python中TypeError报错原因及JSON数据优化访问方案问询
问题原因解析
从你给出的JSON片段能直接明确问题根源:
resp.json()["data"]是字典对象,因此可以通过字符串键(如"metrics")访问对应值- 但
"metrics"对应的是列表(数组),而非字典,所以不能用字符串"basal_energy_burned"作为索引,必须使用整数索引(比如[0]、[1])来获取列表中的元素 - 列表里的每个元素又是字典对象,所以取到元素后(例如
metrics[1]),又能通过字符串键(如"data")访问内部数据
不依赖数字索引的访问方案
直接遍历metrics列表,通过name字段匹配目标数据,这样就算列表元素的顺序发生变化,也不会影响结果。
方案1:基础循环遍历
metrics = resp.json()["data"]["metrics"] target_metric = None # 遍历列表找匹配项 for item in metrics: if item["name"] == "basal_energy_burned": target_metric = item break # 处理找到的数据 if target_metric: basal_energy_data = target_metric["data"] # 这里可以添加你的数据处理逻辑 else: print("未找到basal_energy_burned指标")
方案2:列表推导式简化写法
如果只需快速过滤出目标项,用列表推导式更简洁:
metrics = resp.json()["data"]["metrics"] # 过滤出name匹配的项 basal_energy_items = [item for item in metrics if item["name"] == "basal_energy_burned"] # 取第一个匹配项(假设name字段唯一) if basal_energy_items: basal_energy_data = basal_energy_items[0]["data"] else: print("未找到目标指标")
方案3:封装工具函数(便于复用)
如果需要多次按name查找指标,可以封装成函数:
def get_metric_by_name(metrics_list, target_name): for metric in metrics_list: # 用get避免键不存在报错 if metric.get("name") == target_name: return metric return None # 使用示例 metrics = resp.json()["data"]["metrics"] basal_metric = get_metric_by_name(metrics, "basal_energy_burned") if basal_metric: print(basal_metric["data"]) else: print("目标指标不存在")
内容的提问来源于stack exchange,提问作者Michael Melillo
相关产品推荐
相关产品推荐

