优雅的方式来获得价值Boto3响应字典

时间:2016-01-29 17:31:14

标签: python boto boto3

我使用t.string "type"向我描述我的管道。它以非常好奇的格式回复了一个回复 -

boto3

现在我有兴趣获得管道&ABCD的{'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'}]}]} 价值。如果我尝试以最直观的方式获取它,它会变得非常混乱,因为我必须遍历每个key2列表项,遍历每个列表项'字段& #39;,检查pipelineDescriptionList等于key的那个,然后获取key2

我的问题是,我们实际上是否期望处理这个烂摊子?或者是否有一些Python魔法可以让我的任务更优雅?

1 个答案:

答案 0 :(得分:7)

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

例如,如果您在上面显示的响应绑定到变量response,则可以执行此操作:

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

会返回:

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

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