jsonpathjayway

JsonPath expression involving two root values


I have following JSON, I need to get the personEmailContact which has a matching emailID with emailupdaterequest.emailContact. I tried to write the expression like $.responsebody[?(@.personEmailContact.emailId ==$.emailupdaterequest.emailContact.emailId)] but this does not seem to work, I need to write an expression which can work without substitution. Can anyone help with any pointers

{
    "emailupdaterequest": {
        "emailContact": {
            "emailId": "admin@gmail.com",
            "contactName": "ADMIN EMAIL"
        }
    },
    "responsebody": [
        {
            "personEmailContact": {
                "emailId": "admin@gmail.com",
                "contactTypeCode": "P",
                "contactName": "Joe"
            }
        },
        {
            "personEmailContact": {
                "emailId": "nonadmin@gmail.com",
                "contactTypeCode": "P",
                "contactName": "john"
            }
        }
    ]
}

Solution

  • You should be able to use the root selector $ inside an expression. This will allow you to compare values inside an array element to values elsewhere within the JSON:

    $.responsebody[?(@.personEmailContact.emailId == $.emailupdaterequest.emailContact.emailId)]
    

    Note the $.emailupdaterequest.emailContact.emailId.

    $ indicates the path is evaluated from the root of the JSON, whereas @ indicates that the path is evaluated from the current item as the processor iterates over the array.