Search code examples
javajsonrest-assuredrest-assured-jsonpath

Getting specific data from JSON response using Rest-Assured and java


How can I get the sub-nodes EntityPropertyValue,ProductPropertyValueUId,ProductPropertyValueDisplayName that come under the parent node ["Name": "PriorityUId"] using Rest Assured ?

Below is the code snippet

RequestSpecification request = RestAssured.given();
request.header("Content-Type", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("data", "somedata");  
request.body(requestParams.toJSONString()); 
Response response = request.post("url");
 List<Map<String, String>> epv = response.jsonPath().getList("EntityPropertyValues");
        for(int i=0;i<epv.size();i++)
        {
            if(epv.get(i).containsValue("PriorityUId"))
            {
                System.out.println(epv.get(i));
                break;
                
            }
        }

I am doing a sysout and I get the entire below block of data in response.

{
      "Name": "PriorityUId",
      "Values": [
                    {
                      "EntityPropertyValue": "Critical",
                      "ProductPropertyValueUId": "00000019-0000-0000-0000-000000000033",
                      "ProductPropertyValueDisplayName": "Blocker"
                    },
                    {
                      "EntityPropertyValue": "Critical",
                      "ProductPropertyValueUId": "00000019-0000-0000-0000-000000000034",
                      "ProductPropertyValueDisplayName": "Critical"
                    },
                    {
                      "EntityPropertyValue": "High",
                      "ProductPropertyValueUId": "00000019-0000-0000-0000-000000000035",
                      "ProductPropertyValueDisplayName": "Major"
                    }
      ],
      "DataTypeUId": "00100002-0007-0000-0000-000000000000",
      "DisplayName": "Priority"
    }

How can I capture the fields I am looking for?

Below is the entire JSON response

{
  "ProductInstance": "00000000-0000-0000-0000-000000000000",
  "DataTypeUId": null,
  "EntityPropertyValues": [
    {
      "Name": "ModifiedAtSourceByUser",
      "Values": [],
      "IsPropertyExists": true
    },
    {
      "Name": "ModifiedAtSourceOn",
      "Values": []
    },
    {
      "Name": "PriorityUId",
      "Values": [
                    {
                      "EntityPropertyValue": "Critical",
                      "ProductPropertyValueUId": "00000019-0000-0000-0000-000000000033",
                      "ProductPropertyValueDisplayName": "Blocker"
                    },
                    {
                      "EntityPropertyValue": "Critical",
                      "ProductPropertyValueUId": "00000019-0000-0000-0000-000000000034",
                      "ProductPropertyValueDisplayName": "Critical"
                    },
                    {
                      "EntityPropertyValue": "High",
                      "ProductPropertyValueUId": "00000019-0000-0000-0000-000000000035",
                      "ProductPropertyValueDisplayName": "Major"
                    }
      ],
      "DataTypeUId": "00100002-0007-0000-0000-000000000000",
      "DisplayName": "Priority"
    }
  ]
}

Solution

  • Get a JsonPath view of the response body

    JsonPath js = response.jsonPath();
    

    Get the size of EntityPropertyValues

    int size = js.getInt("EntityPropertyValues.size()");
    

    Loop through the array until you find the desired value, currently - PriorityUId

    If it matches use JsonPath to fetch the values,

        for (int i = 0; i < size; i++) {
            String detail = js.getString("EntityPropertyValues[" + i + "].Name");
            if (detail.equalsIgnoreCase("PriorityUId")) {
                List<Object> EntityPropertyValue = js
                        .getList("EntityPropertyValues[" + i + "].Values.EntityPropertyValue");
                List<Object> ProductPropertyValueUId = js
                        .getList("EntityPropertyValues[" + i + "].Values.ProductPropertyValueUId");
                List<Object> ProductPropertyValueDisplayName = js
                        .getList("EntityPropertyValues[" + i + "].Values.ProductPropertyValueDisplayName");
                System.out.println("Values for EntityPropertyValue : " + EntityPropertyValue);
                System.out.println("Values for ProductPropertyValueUId : " + ProductPropertyValueUId);
                System.out.println("Values for ProductPropertyValueDisplayName : " + ProductPropertyValueDisplayName);
                break;
            }
        }