AWS json输出解析

时间:2019-08-07 22:14:34

标签: aws-cli jmespath

我正在尝试从AWS查询中解析json。我正在尝试获取RedrivePolicy.deadLetterTargetArn

所以,如果我愿意的话:

--output text --query "Attributes.RedrivePolicy"

输出: {"deadLetterTargetArn":"arn:aws:sqs:us-east-2:xxxxxx:cloud-us-east-2-deadletter","maxReceiveCount":4}是正确的

当我进入下一个级别时:

--output text --query "Attributes.RedrivePolicy.deadLetterTargetArn"

在输出中显示None

请在这里找到我的json:

{
    "Attributes": {
        "ApproximateNumberOfMessagesNotVisible": "0", 
        "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"custodian-notify-subscription\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"SQS:SendMessage\",\"Resource\":\"arn:aws:sqs:us-east-2:xxxxxxxx:cloud-us-east-2\",\"Condition\":{\"ArnEquals\":{\"aws:SourceArn\":\"arn:aws:sns:us-east-2:xxxxxxxxx:cloud-us-east-2-notify\"}}}]}", 
        "MessageRetentionPeriod": "86400", 
        "ApproximateNumberOfMessagesDelayed": "0", 
        "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-2:xxxxxxxxx:cloud-us-east-2-deadletter\",\"maxReceiveCount\":4}", 
        "MaximumMessageSize": "262144", 
        "CreatedTimestamp": "1561753144", 
        "ApproximateNumberOfMessages": "0", 
        "ReceiveMessageWaitTimeSeconds": "10", 
        "DelaySeconds": "0", 
        "KmsDataKeyReusePeriodSeconds": "300", 
        "VisibilityTimeout": "600", 
        "LastModifiedTimestamp": "1561753144", 
        "QueueArn": "arn:aws:sqs:us-east-2:xxxxxxxx:cloud-us-east-2"
    }
}

1 个答案:

答案 0 :(得分:0)

快速解答(TL; DR)

  • 如果您尝试使用AWS CLI中的--query关键字对JSON字符串进行JMESPath查询,则不会产生预期的结果
  • 在提供的示例中,JMESPath查询无法按预期方式工作,因为从技术上讲,查询的JSON元素是JSON字符串(即标量),而不是JSON对象(即字典)

详细答案

  • 了解示例为何无法产生预期结果的关键是将JSON string元素与JSON object元素区分开来。

  • 我们在下面提供一些示例,这些示例具有极其简化的JSON场景,有助于说明此处发生的情况。

示例01

  • 在此示例中,我们使用JMESPath查询JSON。之所以能得到预期的结果,是因为我们正在查询JSON object元素。
  • 更详细的描述:我们有一个带有单个名称-值对的顶级json object
    • 名称/值对中的名称由字符串“ Message”组成
    • 名称/值对中的值由JSON object组成
      • 深入研究,JSON object具有两个名称/值对
        // Original JSON
        {
            "Message": {"Greeting":"Hello","Audience":"World!"}
        }

        // JMESPath query 
        --query 'Message.Greeting'

        // JMESPath result
        'Hello'

示例02

  • 在此示例中,我们使用JMESPath查询JSON。由于要查询JSON string元素,因此我们得到了不必要的结果。

    • 更详细的描述:我们有一个带有单个名称-值对的顶级json object
      • 名称/值对中的名称由字符串“ Message”组成
      • 名称/值对中的值由JSON string组成
        • 深入研究一下,JSON string类似于JSON对象,但它不是JSON对象,因为它遵循JSON string的约定
        // Original JSON
        {
            "Message": "{\"Greeting\":\"Hello\",\"Audience\":\"World!\"}"
        }

        // JMESPath query 
        --query 'Message.Greeting'

        // JMESPath result
        None (null result)

另请参见