如何从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
相关产品推荐
相关产品推荐

