python - 从 Boto3 响应指令中获取值的优雅方式

标签 python boto boto3

我正在使用 boto3 向我描述我的管道。它以一种非常奇怪的格式返回响应 -

{'ResponseMetadata': {'HTTPStatusCode': 200,
                      'RequestId': '2c42a320-c6ab-11e5-a021-afa8e3e7ca24'},
 u'pipelineDescriptionList': [{u'fields': [{u'key': u'key1', u'stringValue': u'AIDAIxxxxxxNWNI6I'},
                                           {u'key': u'key2', u'stringValue': u'2016-01-29T13:32:09'},
                                           {u'key': u'key3', u'stringValue': u'ABCD'},
                                           {u'key': u'key4', u'stringValue': u'PIPELINE'}],
                               u'name': u'ABCD',
                               u'pipelineId': u'df-03442XXXXAZTRKE4NNK',
                               u'tags': []},
                              {u'fields': [{u'key': u'key1',u'stringValue': u'2016-01-29T11:26:02'},
                                           {u'key': u'key2', u'stringValue': u'[{"key":"jobrun","value":"RzIN"},{"key":"env","value":"prod"}]'},
                                           {u'key': u'key3', u'stringValue': u'2016-01-29T11:25:20'},
                                           {u'key': u'key4', u'stringValue': u'PIPELINE'}],
                               u'name': u'test-pipeline',
                               u'pipelineId': u'df-006474936ZXRQ238Q70O',
                               u'tags': [{u'key': u'jobrun', u'value': u'RWssN'},{u'key': u'env', u'value': u'prod'}]}]}

现在我有兴趣获取管道“ABCD”的 key2 值。如果我尝试以最直观的方式获取它,它会变得非常困惑,因为我必须遍历每个 pipelineDescriptionList 列表项,遍历“字段”中的每个列表项,检查 key 等于 key2 的那个,并获取它的 stringValue

我的问题是,我们真的需要处理这个烂摊子吗?或者是否有一些 Python 魔法可以使我的任务更优雅?

最佳答案

一个选择是使用 jmespath它与 boto3 捆绑在一起。它是处理类似 JSON 的数据结构的非常强大的工具。

例如,如果上面显示的响应绑定(bind)到变量 response,您可以这样做:

jmespath.search("pipelineDescriptionList[?name == 'ABCD'].fields[] | [?key == 'key2'].stringValue", response)

会返回:

[u'2016-01-29T13:32:09']

可能有更好的方法来做到这一点,这只是一个快速的切入点。您还可以编译这些表达式,以提高使用同一查询进行多次搜索的效率。

关于python - 从 Boto3 响应指令中获取值的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35090535/

相关文章:

Python:如何用一系列数字填充数组?

python - Boto逆流

python - 使用 python 的 boto 从 S3 检索数据时出错

python - 如何使用 AWS Python SDK Boto 3 等待 Elastic Beanstalk 事件

amazon-web-services - 使用 Cognito UserPools 进行社交登录的 Boto3

python - numpy.linalg.solve 和 numpy.linalg.lu_solve 之间的区别

python - 在 json 中保存 PIL 图像的最佳方法是什么

python - 将正则表达式与日期时间一起使用

amazon-web-services - 皮波托 : remove an ip based rule from a security group

raspberry-pi2 - 导入错误 : No module named boto3