【问题标题】:Python | How to parse JSON from results from AWS response?蟒蛇 |如何从 AWS 响应的结果中解析 JSON?
【发布时间】:2021-08-19 21:41:18
【问题描述】:

我试图获取VersionLabel 的值,即php-v1,但我的代码无法正常工作,我不知道自己做错了什么。

能否请您告诉我出了什么问题以及如何解析php-v1

这是我的错误信息。

TypeError: the JSON object must be str, not 'dict'

这是我的代码。

#!/usr/bin/env python3

import boto3
import json

def get_label():
   try:
      env_name = 'my-env'
      eb = boto3.client('elasticbeanstalk')
      response = eb.describe_instances_health(
         EnvironmentName=env_name,
         AttributeNames=[
            'Deployment'
         ]
      )
      #print(response)
      data = json.loads(response)
      print(data['VersionLabel'])
   except:
      raise

if __name__ == '__main__':
   get_label()

这是我在调用 print(response) 时从 AWS 得到的响应。

{
   'InstanceHealthList':[  
      {  
         'InstanceId':'i-12345678',
         'Deployment':{  
            'DeploymentId':2,
            'DeploymentTime':datetime.datetime(2016,
            9,
            29,
            4,
            29,
            26,
            tzinfo=tzutc()),
            'Status':'Deployed',
            'VersionLabel':'php-v1'
         }
      }
   ],
   'ResponseMetadata':{  
      'HTTPStatusCode':200,
      'RequestId':'12345678-1234-1234-1234-123456789012',
      'RetryAttempts':0,
      'HTTPHeaders':{  
         'content-length':'665',
         'content-type':'text/xml',
         'date':'Sat, 01 Oct 2016 11:04:56 GMT',
         'x-amzn-requestid':'12345678-1234-1234-1234-123456789012'
      }
   }
}

非常感谢!

【问题讨论】:

  • 我不是 boto3 用户,但似乎已经为您完成了 json 解码。你觉得response 中的dict 对吗?
  • 如果您的print(response) 是在说datetime.datetime 之类的内容并使用单引号(在JSON 中是非法的),那么它肯定已经为您转换了。
  • 尝试注释掉 #data = json.loads(response) 并添加这一行:print(response['InstanceHealthList'][0]['Deployment']['VersionLabel'])。这会给你想要的结果吗?
  • @tdelaney 感谢您的检查!那么意味着我必须停止使用 json 模块吗?如何获取 VersionLabel 的值?
  • @BB 的建议应该这样做。

标签: python json amazon-web-services boto


【解决方案1】:

根据 boto3 文档 [http://boto3.readthedocs.io/en/latest/reference/services/elasticbeanstalk.html?highlight=describe_instances_health#ElasticBeanstalk.Client.describe_instances_health],describe_instances_health 方法返回 dict 而不是 json。因此,您无需进行转换。 要从数据中获取 VersionLabel,请使用 -

data ['InstanceHealthList'][0]['Deployment']['VersionLabel']

编辑:请注意,上面从可能的多个实例中获取第一个实例的 VersionLabel。如果您有多个实例并且它们恰好具有不同的 VersionLabel 值,那么您将需要额外的逻辑来获得您需要的那个。

【讨论】:

  • 对具有如此深嵌套的 AWS 响应赞不绝口...
【解决方案2】:

如果要求是将 boto 响应转换为合法的 json 格式 -

import json
response_json = json.dumps(response, default=str))

dict转json时需要处理datetime.datetime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多