REST-Assured - JsonPath to get a list of values
I am using REST-Assured to test some RESTful web services. Here is my JSON:
{
"status":true,
"responseData":{
"orderLevelReasons":[
{
"reasons":[
{
"reasonId":"129cfea8-b022-4dc8-9811-222a324f46aa",
"reasonName":"COD Amount Mismatch"
},
{
"reasonId":"a881fd5c-626e-438c-8026-646aa2a19098",
"reasonName":"Gave wrong information"
},
{
"reasonId":"543d438a-88cc-487c-86e4-19eecefa9ca7",
"reasonName":"Late delivery"
},
{
"reasonId":"080cd7c1-7a37-48ad-9090-57286d93ea41",
"reasonName":"Parcel not received"
},
{
"reasonId":"5ca3d9b4-0fa2-49da-a534-a6f2e7eccc07",
"reasonName":"Staff did not inform about the parcel arrival"
}
],
"issueName":"ISSUE TYPE 1",
"issueId":"0c2c37a6-62b6-4c28-ab6c-566487d045bd",
"hint":""
},
{
"reasons":[
{
"reasonId":"129cfea8-b022-4dc8-9811-222a324f46aa",
"reasonName":"COD Amount Mismatch"
},
{
"reasonId":"14975b5d-23fb-4735-8082-2e02d6335788",
"reasonName":"Data issue"
},
{
"reasonId":"7e6e8446-3774-4589-9171-8e7ab0a7f73b",
"reasonName":"Delivery BOY did not inform before delivering"
},
{
"reasonId":"543d438a-88cc-487c-86e4-19eecefa9ca7",
"reasonName":"Late delivery"
},
{
"reasonId":"080cd7c1-7a37-48ad-9090-57286d93ea41",
"reasonName":"Parcel not received"
},
{
"reasonId":"8e430c71-f28b-49e4-9946-e0bd5131768b",
"reasonName":"Refuse to come doorstep"
},
{
"reasonId":"515d0fa4-a44c-47eb-a7a2-5ddae778f37a",
"reasonName":"Extra Amount taken By Partner Staff"
}
],
"issueName":"ISSUE TYPE 2",
"issueId":"ac902377-3db2-462a-8e53-48b06d1aff1f",
"hint":""
}
],
"productLevelReasons":[
{
"reasons":[
{
"reasonId":"6129dcb8-1ae5-4d7d-9c95-4c0ec2f69ded",
"reasonName":"Some reason1"
},
{
"reasonId":"febec32b-b243-4509-b46a-20d9f4747ca3",
"reasonName":"Some reason2"
},
{
"reasonId":"d8a492b8-f816-41e6-b45d-5ec29f3a0785",
"reasonName":"Some reason3"
},
{
"reasonId":"c0c98489-6401-455a-9145-f52664d8aff4",
"reasonName":"Some reason4"
},
{
"reasonId":"ef2b4147-ee76-4961-b784-63e848a84167",
"reasonName":"Some reason5"
},
{
"reasonId":"7f4f9657-17b2-407b-aed7-16b221bf3229",
"reasonName":"Some reason6"
},
{
"reasonId":"2aa83be6-60cb-43dc-9273-c41e6047315e",
"reasonName":"Others"
},
{
"reasonId":"c432f563-f835-4710-8055-5ee9e0fe1409",
"reasonName":"Some reason7"
}
],
"orderItemName":"Item1",
"orderItemId":961253,
"hint":""
}
]
},
"message":"OK"
}
I would like to receive:
- List of all values
reasonId
inresponseData.orderLevelReasons
. - List of all values
reasonId
underresponseData.productLevelReasons
, whereorderItemId
961253
(as there may be productLevelReasons for multipleorderItemIds
).
I searched a lot for this and found that it could be achieved with JsonPath
, but I couldn't figure out exactly which JsonPath expressions for each of my goals.
source to share
List of all reasonId values ββin responseData.orderLevelReasons
$.responseData.orderLevelReasons[*].reasons[*].reasonId
[*] for orderLevelReasons is required if you need reasons from all elements of the orderLevelReasons collection. If not, you can replace it with [0] and you can get a separate list (while repeating the same reasons for each orderLevelReasons).
List of all reasonId values ββin responseData.productLevelReasons file where orderItemId is 961253 (as there might be productLevelReasons for multiple orderItemIds).
$.responseData.productLevelReasons[?(@.orderItemId=='961253')].reasons[*].reasonId
It is also no different. You will need to remove duplicates if there are duplicate reasons.
I've checked both JsonPath expressions at jsonpath.curiousconcept.com, both are valid. But the Java code gives an error for some reason.
I looked into this. The robust framework doesn't actually implement JsonPath, but the JSON request syntax based on a proprietary path. Unfortunately, the name is the same, but in fact it is based on a completely different standard.
This docs page explains:
Note that the JsonPath implementation uses Groovy GPath syntax and should not be confused with the Jayway JsonPath implementation.
The JsonPath tag on StackOverflow is related to the accepted JsonPath specification, not the guarantee of the rest of the information.
Based on my research, I would conclude that the persistence-guaranteed jsonpath implementation does not support your requirements. You should use an implementation that does Jayway one for example .
source to share