'Using Karate, how do I loop though a json to pick up the value for a key based on another key in that json block?

Below is the JSON response I get from which I want to extract y1. Before getting the response, I know x1 already but I don't know y1. So for that particular x key element, I want to get its y value (in this case y1).

My json response looks like this:

{
    "result": [
        {
            "x": "x1",
            "y": "y1"
        },
        {
            "x": "x2",
            "y": "y2"
        }
    ]
}

Below is what I am trying in Karate but it seems it picks up null instead:

* def y = get[0] response..result[?(@.x=='x')]

I captured x1 from a previous call. Please let me know where I am wrong. Thanks.



Solution 1:[1]

Let's say you have stored x1 in a variable called valX from your previous call. You can now use the below to get y1

* def valY = karate.jsonPath(response, "$.result[?(@.x=='" + valX +"')]")[0].y

You could read

Solution 2:[2]

Yes, for dynamic JsonPath, please read the docs: https://github.com/karatelabs/karate#jsonpath-filters

In the latest versions of Karate > 1.0, I also recommend using JS to do things like this:

* def xToFind = 'x1'
* def found = response.result.find(o => o.x == xToFind)
* match found == { x: 'x1', y: 'y1' } 

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Peter Thomas