You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从JSON中提取单个对象?现有Python代码修改求助

解决CloudWatch Dashboard Metric Widget提取问题

我来帮你修正这段代码,先看看现有代码里的几个问题:

  • 多余的JSON序列化操作:response['DashboardBody']本身就是一个JSON格式的字符串,你不需要再用json.dumps()去处理它——这会把原本的JSON字符串转成带转义字符的新字符串,后续json.loads(r)得到的还是原字符串,不是解析后的字典对象,所以loaded_r[1]根本取不到你想要的widget。
  • 错误的访问路径:即使解析正确,你也需要先访问widgets数组,再筛选其中type为metric的对象,而不是直接对整个解析后的对象取索引。

下面是修正后的完整代码,能准确提取所有metric类型的widget:

import boto3
import json

# 创建CloudWatch客户端
client = boto3.client('cloudwatch')

# 获取指定Dashboard的内容
response = client.get_dashboard(DashboardName='ritesh')
dashboard_body = response['DashboardBody']

# 直接将JSON字符串解析为Python字典
dashboard_data = json.loads(dashboard_body)

# 筛选出所有类型为'metric'的widget(列表推导式更简洁)
metric_widgets = [widget for widget in dashboard_data['widgets'] if widget['type'] == 'metric']

# 输出第一个符合条件的widget(如果有),用indent参数让格式更美观
if metric_widgets:
    print(json.dumps(metric_widgets[0], indent=2))
else:
    print("未找到类型为metric的widget")

代码说明:

  • 去掉了冗余的json.dumps(body)步骤,直接用json.loads()解析Dashboard返回的JSON字符串。
  • 使用列表推导式快速筛选出所有type字段为metric的widget对象,如果你需要所有符合条件的widget,直接遍历metric_widgets即可。
  • 增加了判断逻辑,避免没有找到对应widget时出现索引错误。

如果只想提取第一个metric类型的widget,也可以用循环遍历的方式:

for widget in dashboard_data['widgets']:
    if widget['type'] == 'metric':
        print(json.dumps(widget, indent=2))
        break  # 找到第一个就停止遍历

内容的提问来源于stack exchange,提问作者RITESH SANJAY MAHAJAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:20:56