Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    broskees
    @broskees
    Just returns { companies: null, employees: null }
    Chris Armstrong
    @chris-armstrong
    oh I thought the flatten operator would just give the values.
    try values(@) | { companies: [?type.text=='company'], employees: [?type.text=='employee'] }
    kguggulotu
    @kguggulotu

    I'd like to use jmespath to transform json from:

    {
        "order": {
            "order_type": "online",
            "item": [
                {
                    "item_nbr": 1,
                    "item_type": "so",
                    "mlog": [
                        {
                            "id":"1",
                            "timestamp":"2019-12-13"
                        },
                        {
                            "id":"2",
                            "timestamp":"2019-12-13"
                        }
                    ]
                },
                {
                    "item_nbr": 2,
                    "item_type": "so",
                    "mlog": [
                        {
                            "id":"1",
                            "timestamp":"2019-12-13"
                        },
                        {
                            "id":"3",
                            "timestamp":"2019-12-13"
                        }
                    ]
                }
            ],
            "mlog": [
                {
                    "id":"5",
                    "timestamp":"2019-12-13"
                },
                {
                    "id":"6",
                    "timestamp":"2019-12-13"
                }
            ]
        }
    }

    to

    [
        {
            "order": {
                "order_type": "online",
                "item": [
                    {
                        "item_nbr": 1,
                        "item_type": "so",
                        "mlog": [
                            {
                                "id": "1",
                                "timestamp": "2019-12-13"
                            },
                            {
                                "id": "2",
                                "timestamp": "2019-12-13"
                            }
                        ]
                    }
                ],
                "mlog": [
                    {
                        "id": "5",
                        "timestamp": "2019-12-13"
                    },
                    {
                        "id": "6",
                        "timestamp": "2019-12-13"
                    }
                ]
            }
        },
        {
            "order": {
                "order_type": "online",
                "item": [
                    {
                        "item_nbr": 2,
                        "item_type": "so",
                        "mlog": [
                            {
                                "id": "1",
                                "timestamp": "2019-12-13"
                            },
                            {
                                "id": "3",
                                "timestamp": "2019-12-13"
                            }
                        ]
                    }
                ],
                "mlog": [
                    {
                        "id": "5",
                        "timestamp": "2019-12-13"
                    },
                    {
                        "id": "6",
                        "timestamp": "2019-12-13"
                    }
                ]
            }
        },
        {
            "order": {
                "order_type": "online",
                "mlog": [
                    {
                        "id": "5",
                        "timestamp": "2019-12-13"
                    },
                    {
                        "id": "6",
                        "timestamp": "2019-12-13"
                    }
                ]
            }
        }
    ]
    Can someone help me with the query ?
    Chris Armstrong
    @chris-armstrong
    It looks like a fairly complicated transformation - you might want to break it down
    Rajat Taneja
    @rajataneja101
    Hi all, lets say i have a json like following: [
    {
    "Name": "JsonOneName",
    "Description": "JSONONEDESCRIPTION"
    },{
    "Name": "JsonTwoName",
    "Description": "JsonOneDescription"
    }
    ]
    Now the problem which i am facing is, in the above json both the blocks have a same json block with same description just the casing is different so how can i run my json query without the case sensitivity even though the description is same??
    alexanderinsa
    @alexanderinsa
    I'm new to working with jmespath and I was wondering if there was a way to select multiple dictionary keys based on if that key contains a string? So like {a:blah, aa:blah, c:notblah} I would like to flatten the results of the keys that contain an a?
    Chris Armstrong
    @chris-armstrong
    @alexanderinsa from what I can tell, this isn't something JMESpath supports
    alexanderinsa
    @alexanderinsa
    I couldn't find a way either, but my use case was with ansible , so I was able to use a filter to convert each key value pair to a list of dictionaries with a common key and was able to loop through and check the now common key.
    Ciaran Evans
    @ciaranevans

    Hi folks, I'm doing some boto3 work in Python and I have the following lines:

    paginator = client.get_paginator('list_objects_v2')
    page_iterator = paginator.paginate(Bucket=bucket_name)  # PaginationConfig MaxItems & PageSize left off intentionally
    filtered_iterator = page_iterator.search("Contents[?contains(Key, `{0}`)][]".format(mgrs_square))

    I get the following warning:

    jmespath/lexer.py:170: PendingDeprecationWarning: deprecated string literal syntax PendingDeprecationWarning)

    Is there a way I can change my JMESPath to not give that warning? - Completely new to this as it's not a functionality I've used before.

    Thanks!

    Chris Armstrong
    @chris-armstrong
    It might be worth raising a ticket with the maintainer on the project page @ciaranevans https://github.com/jmespath/jmespath.py
    Raghav Bijjula ☁️
    @BijjulaRaghav_twitter

    Hello,
    I want to yield priority value if a substring in TargetGroupArn matches from following JSON

    [
    {
    "Priority": "4",
    "TargetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:app1/957d07a4bb7b4c3b"
    },
    {
    "Priority": "5",
    "TargetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:app2/11f33cd58c040b74"
    },
    {
    "Priority": "default",
    "TargetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:app3/b0a01b36e3cb45be"
    }
    ]

    Is there a way I can accomplish with jmespath ?
    Chris Armstrong
    @chris-armstrong
    [?TargetGroupArn=='arn:aws:elasticloadbalancing:us-east-1:app1/957d07a4bb7b4c3b'][0].Priority
    Erik Berg
    @eb4x_gitlab

    I'm leaving this here as a puzzle someone might help me solve. I have a netplan (converted from yaml), and I haven't quite figured out how to combine searches in these types of nested dicts.

    {
      "ethernets": {
        "enp3s0f0": {
          "match": {
            "macaddress": "01:23:45:67:89:ab"
          },
          "set-name": "eth0"
        },
        "enp3s0f1": {
          "match": {
            "macaddress": "cd:ef:01:23:45:67"
          },
          "set-name": "eth1"
        },
        "enp4s0f0": {
          "match": {
            "macaddress": "89:ab:cd:ef:01:23"
          },
          "set-name": "eth2"
        },
        "enp4s0f1": {
          "match": {
            "macaddress": "45:67:89:ab:cd:ef"
          },
          "set-name": "eth3",
          "addresses": [
            "172.16.0.3/24"
          ]
        }
      },
      "bonds": {
        "bond0": {
          "interfaces": [
            "eth0",
            "eth1"
          ],
          "parameters": {
            "mode": "802.3ad"
          }
        }
      },
      "vlans": [
        "bond0.1202",
        "bond0.203",
        "bond0.204",
        "bond0.205"
      ],
      "bridges": {
        "br-maas": {
          "addresses": [
            "172.16.1.3/24"
          ],
          "interfaces": [
            "bond0"
          ]
        },
        "br-mgmt": {
          "addresses": [
            "172.16.2.3/24"
          ],
          "interfaces": [
            "bond0.1202"
          ]
        },
        "br-storage": {
          "addresses": [
            "172.16.3.3/24"
          ],
          "interfaces": [
            "bond0.203"
          ]
        },
        "br-vxlan": {
          "addresses": [
            "172.16.4.3/24"
          ],
          "interfaces": [
            "bond0.204"
          ]
        },
        "br-iscsi": {
          "addresses": [
            "172.16.5.3/24"
          ],
          "interfaces": [
            "bond0.205"
          ]
        },
        "br-vlan": {
          "interfaces": [
            "eth2"
          ]
        }
      }
    }

    *.*.addresses will yield addresses, I can flatten it with [] but I suppose a [?addresses] type filter would be a better approach, so we only look for those with addresses. [keys(@)] gives me [ethernets, bonds, vlans, bridges], but *.[keys(@)] doesn't seem to give me the interface-names. But then *.*[keys(@)] gives me keys inside the interfaces.

    I'd like to get something that returns interface-name + address in some kind of combination. Like [ ["enp4s0f1", "172.16.0.3/24"], ["br-maas", "172.16.1.3/24"], ...]or [ {"enp4s0f1": ["172.16.0.3/24"]},{"br-maas":["172.16.1.3/24"]}, ...]

    Erik Berg
    @eb4x_gitlab
    So apparently the "vlans": [...] is causing problems? I removed it, and now I get something from *.[keys(@)]. I can probably work with this... Just fix the vlans in my lazy netplan.
    Gabriel
    @GaboFDC

    hey guys, not sure if this is the proper place, but just a suggestion in the contains examples would also be good to explain this syntax

    machines[?contains(guest_fullname, `Windows`) == `false`]

    for dicts like:

    {
      "machines": [
        {
          "guest_fullname": "Other (32-bit)",
          "age": 30
        },
        {
          "guest_fullname": "Microsoft Windows 10 (64-bit)",
          "age": 50
        },
        {
          "name": "Ubuntu",
          "age": 40
        }
      ]
    }

    I needed to do it, but it was really hard to come up with the proper syntax, wasn't even sure if it was possible.

    Dominic D'Apice
    @dapiced
    anyone can help me with the function max() ?
    Harbie34
    @Harbie34

    Hi, there!
    I'm trying to convert the result of AWS CloudWatch Logs Insights, but I can't.

    Like this:

    {
        "results": [
            [
                {
                    "field": "@timestamp",
                    "value": "2020-02-03 15:03:26.315"
                },
                {
                    "field": "@message",
                    "value": "some messages 1"
                },
                {
                    "field": "@ptr",
                    "value": "xxx"
                }
            ],
            [
                {
                    "field": "@timestamp",
                    "value": "2020-02-03 15:03:27.495"
                },
                {
                    "field": "@message",
                    "value": "some messages 2"
                },
                {
                    "field": "@ptr",
                    "value": "xxx"
                }
            ]
        ],
        "statistics": {
            "recordsMatched": 887.0,
            "recordsScanned": 887.0,
            "bytesScanned": 101532.0
        },
        "status": "Complete"
    }

    To this:

    [
        [ "2020-02-03 15:03:26.315", "some messages 1" ],
        [ "2020-02-03 15:03:27.495", "some messages 2" ]
    ]

    Can anyone help me?

    Chris Armstrong
    @chris-armstrong
    JMESPath makes this trickier than it needs to be, but here it is @Harbie34:
    map(&[([?field=='@timestamp'])[0].value, ([?field=='@message'])[0].value ], results)
    Harbie34
    @Harbie34
    @chris-armstrong Wow! Excellent! I'll study the map function more. Thanks!
    Chris Armstrong
    @chris-armstrong
    No worries - I think this one can also be done with filter expressions and pipes but I haven't explored that.
    Harbie34
    @Harbie34
    @chris-armstrong Hmm... I'll try to think a little more, too.
    Jason Slagle
    @jmslagle
    Is JEP-11 dead?
    Jens J.
    @zerog2k

    I feel really dumb, but can't seem to figure out how to transform this:

    {
        "Foo": "somekey",
        "Bar": "somevalue"
    }

    into:

    { "somekey": "somevalue" }

    the closest I can get is like:

    { Foo : Bar }

    but that yields:

    {
      "Foo": "somevalue"
    }

    so it's the key in the hash part I cant figure out how to get
    (I want to make the new hash's key, the value of an existing key in the input hash)

    Jens J.
    @zerog2k

    so I have read somewhere this may not be possible w/ stock JMESPath

    Jmespath does not allow to use dynamic names in multi select hashes.

    but there is some extension:
    https://github.com/grofers/go-codon/wiki/Jmespath-extensions#5-support-for--expressions-as-key-when-performing-multi-select-hash
    (wanted to be able to do this in aws cli --query )

    Jens J.
    @zerog2k
    i guess i need to pass output through jq from_entries
    aws ec2 describe-tags --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags' | jq from_entries >/tmp/tags.json
    basically gives me what I want ;)
    wu-lee
    @wu-lee
    Is there a way to turn an object of objects into a list of {key1, key2, value} objects?
    For example: {animal: {ant: 1, bee: 2, cat: 3}, vegetable: {apple: 4, banana: 5}, mineral: {axe: 6, bell; 7}} into [{key1: "animal", key2: "ant", value: }, {key1: "animal", key2: "bee", value: 2}, ... {key1: "mineral", key2: "bell", value: 7}]
    wu-lee
    @wu-lee
    Or even just doing it for a single object?
    dr7tbien
    @dr7tbien
    ¿?
    Hi
    dr7tbien
    @dr7tbien
    I'm trying install aws sdk php v3. And I've got this:
    composer require aws/aws-sdk-php
    Using version ^3.133 for aws/aws-sdk-php
    ./composer.json has been created
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - Installation request for mtdowling/jmespath.php (installed at 2.4.0) -> satisfiable by mtdowling/jmespath.php[2.4.0].
        - aws/aws-sdk-php 3.133.0 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.1 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.10 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.11 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.2 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.3 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.4 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.5 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.6 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.7 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.8 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.9 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - Conclusion: don't install mtdowling/jmespath.php 2.5.0
        - Installation request for aws/aws-sdk-php ^3.133 -> satisfiable by aws/aws-sdk-php[3.133.0, 3.133.1, 3.133.10, 3.133.11, 3.133.2, 3.133.3, 3.133.4, 3.133.5, 3.133.6, 3.133.7, 3.133.8, 3.133.9].
    
    
    Installation failed, deleting ./composer.json.
    The issue is that ubuntu only can get V2.3 by apt-get
    how I could install the V2.5?
    Doqnach
    @Doqnach
    how do you mean apt-get?
    this says composer @dr7tbien
    try composer why --tree mtdowling/jmespath to see why it is locked to 2.4.0
    Andrew Curioso
    @andrewcurioso
    Hello all... is there a way to emulate a ternary operator? Basically I want one value is there is a match and another value if there isn't
    Never mind, this works
    locations[0].state == 'NY' && 'a' || 'b'
    lakshmi Pendyala
    @lpendyala_gitlab
    Hi Everyone, new to jmespath and yaml. So I've a requirement where I'm substituting region as a variable, I'm getting this error. jmespath.exceptions.LexerError: Bad jmespath expression: Unknown token '-':
    "123456789012".us-east-1 . Any help would be appreciable.
    this is my original yaml file expression expr: '"{account_id}".{region}'
    James Saryerwinnie
    @jamesls
    You need to quote values that have chars that aren't a-zA-Z0-9
    try "{account_id}"."{region}"
    lakshmi Pendyala
    @lpendyala_gitlab
    expected <block end>, but found '<scalar>'
    in "<unicode string>", line 18, column 31:
    expr: "{account_id}"."{region}"
    James Saryerwinnie
    @jamesls
    I don't think that's a jmespath error? Here's a full example:
    $ echo '{"12345": {"us-east-1": "value-i-want"}}' | jp.py '"12345"."us-east-1"'
    "value-i-want"
    lakshmi Pendyala
    @lpendyala_gitlab
    this expression is in yaml file
    even for me it's working good when I queried this command cat /tmp/test.json | jp '"987654321012"."us-east-1"'
    James Saryerwinnie
    @jamesls
    oh, maybe just quote the whole value in the yaml file. I'm guessing yaml's thinking it's two separate strings. So:
    expr: '"{account_id}"."{region}"'