REST-Assured - JsonPath для получения списка значений

Я использую REST-Assured для тестирования некоторых веб-сервисов RESTful. Вот мой 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"
}

Я хочу получить:

  1. Список всех reasonId значений в responseData.orderLevelReasons.
  2. Список всех reasonId значений в разделе responseData.productLevelReasons, где orderItemId - это 961253 (поскольку productLevelReasons может быть для нескольких orderItemIds).

Я довольно много искал это в Google и обнаружил, что этого можно достичь с помощью JsonPath, но я не мог понять, какими именно будут выражения JsonPath для каждой из моих целей.


person Akshay Maldhure    schedule 12.04.2017    source источник


Ответы (1)


Список всех значений reasonId в responseData.orderLevelReasons

$.responseData.orderLevelReasons[*].reasons[*].reasonId

[*] Для orderLevelReasons необходимо, если вы хотите получить причины для всех элементов в коллекции orderLevelReasons. Если нет, вы можете заменить его на [0] и получить отдельный список (при условии, что одни и те же причины повторяются для каждого orderLevelReasons).

Список всех значений causeId в responseData.productLevelReasons, где orderItemId равен 961253 (поскольку productLevelReasons может быть для нескольких orderItemIds).

$.responseData.productLevelReasons[?(@.orderItemId=='961253')].reasons[*].reasonId

Это тоже не внятно. Вам нужно будет исключить дубликаты, если могут существовать повторяющиеся причины.

Я проверил оба ваших выражения JsonPath на jsonpath.curiousconcept.com, оба они действительны. Но код Java по какой-то причине дает ошибку.

Я изучил это. Фреймворк с обеспечением покоя на самом деле не реализует JsonPath, а использует собственный синтаксис запроса на основе пути для JSON. К сожалению, название осталось прежним, но на самом деле оно основано на совершенно другом стандарте.

На этой странице документации объясняется:

Обратите внимание, что реализация JsonPath использует синтаксис Groovy GPath, и ее не следует путать с реализацией Jayway JsonPath.

Тег JsonPath в StackOverflow связан с принятой спецификацией JsonPath, а не с гарантированной спецификацией.

Основываясь на своих исследованиях, я бы пришел к выводу, что реализация jsonpath с надежной гарантией не поддерживает ваше требование. Вам следует использовать такую ​​реализацию, как Jayway.

person tom redfern    schedule 12.04.2017
comment
Спасибо, Том! Я пытаюсь использовать выражение JsonPath таким образом: List<String> orderLevelReasons = new ArrayList<String>(); orderLevelReasons = jsonPath.getList("$.responseData.orderLevelReasons[*].reasons[*].reasonId");, но это дает ошибку Invalid JSON expression. - person Akshay Maldhure; 12.04.2017
comment
Я проверил оба ваших выражения JsonPath на jsonpath.curiousconcept.com, оба они действительны и возвращают ожидаемые результаты . Но код Java по какой-то причине дает ошибку. :( - person Akshay Maldhure; 12.04.2017
comment
Спасибо, Том! Я понял, что пытался использовать REST-Assured JsonPath, но с Jayway JsonPath ваше второе выражение дает корректный вывод из моего кода, но первое выражение возвращает пустой список. - person Akshay Maldhure; 12.04.2017
comment
Я пытался с List<Object>. После попытки с List<String> он работает должным образом. Большое спасибо, Том! Однако я хотел бы знать, как вы получили выражения JsonPath. :) - person Akshay Maldhure; 12.04.2017
comment
@AkshayMaldhure - я читал спецификацию;). То, что я обнаружил, случайно поигрывая с равенством строк. Имеет смысл, что это должно работать как равенство строк в javascript. - person tom redfern; 12.04.2017