Search code examples
arraysjsonsyntaxjmespath

Count the number of instances in an array using JMESPath


In the example JSON at the bottom of this question, how can I count the number of key/value pairs in the array "Tags" using JMESPath?

According to the JMESPath documentation, I can do this using the count() function -

For example, the following expression creates an array containing the total number of elements in the foo object followed by the value of foo["bar"].

However, it seems that the documentation is incorrect. Using the JMESPath website, the query Reservations[].Instances[].[count(@), Tags] yeilds the result [ [ null ] ]. I then tested via the AWS command line and an error was returned -

Unknown function: count()

Is there actually a way of doing this using JMESPath?

Example JSON -

{
    "Reservations": [
        {
            "Instances": [
                {
                    "InstanceId": "i-asdf1234",
                    "InstanceName": "My Instance",
                    "Tags": [
                        {
                            "Value": "Value1",
                            "Key": "Key1"
                        },
                        {
                            "Value": "Value2",
                            "Key": "Key2"
                        },
                        {
                            "Value": "Value3",
                            "Key": "Key3"
                        },
                        {
                            "Value": "Value4",
                            "Key": "Key4"
                        }
                    ]
                }
            ]
        }
    ]
}

Solution

  • The answer here is that the JMESPath documentation is shocking, and for some reason I was seeing out of date documentation (check the bottom right corner of the screen to see what version you are viewing.

    I can do what I need to do using the length() function -

    Reservations[].Instances[].Tags[] | length(@)