Как использовать свойство @ odata.count в выражении JSONPath? - PullRequest
3 голосов
/ 29 марта 2019

Использование следующего объекта JSON из ответа API OData v4:

{

   "@odata.context": "https://api.asdfasdf.com/",
   "@odata.count": 2,
   "value": [
        {
            "id": 123456789,
            "name": "Random name"
        },
        {
            "id": 15345,
            "name": "Random name2"
        }
    ]
}

Это работает для выбора объекта в массиве: $.value[?(@.id == 123456789)]

С помощью этого JSONPath я могуполучить значение свойства "@ odata.count": $.['@odata.count']

Но как написать JSONPath с выражениями, использующими "@ odata.count"?Например.При выборе только, если число больше 1, эти выражения не выполняются:

$.[('@odata.count' > 1)]
$.[?('@odata.count' > 1)]
$.[(@.['@odata.count'] > 1)]
... and a lot of other expressions

Я твердо верю, что я работаю на другой глубине json, чем я думаю, и соглашения об именовании свойства (испособ его выбора) сводит меня с ума.

Конечная цель - использовать выражение в утверждении SoapUI Testsuite.

Сравнение свойства "@ odata.count" в ответе на наш тестdata.

Редактировать: Исправлено json, благодаря удалению кавычек после числа, благодаря commenter.

И дополнительные результаты выражений, которые помогли мне найти решение:

Эти выражения приводят к '2':

$['@odata.count']
$..[0]['@odata.count']

Это выражение приводит к пустому массиву:

$..[?(@['@odata.count'] > 1)]

Это выражение приводит к значению 'null':

?($['@odata.count'] > 1)

Редактировать 2: Этот вопрос должен был быть задан несколько более общим, я думаю, это больше о том, "как использовать корневые свойства / корневые атрибуты / прямые дочерние элементы ответа в JSONPatчас".Подобный вопрос, который я нашел, с совершенно другим ответом: Запрос прямых дочерних элементов корневого элемента с помощью jsonpath

1 Ответ

0 голосов
/ 01 апреля 2019

Хорошо, у меня работает следующее:

$..[?(@.['@odata.count'] > 1)]

Это дает мне тот же массив, что и выражение $.. (массив, содержащий ответ json).Что он делает, согласно моим собственным выводам:

$..[] - просматривает массив, содержащий ответ

?(@.['@odata.count'] > 1) - выбирает элемент массива, содержащий свойство со значением больше 1

Пожалуйста, поправьте меня, если я ошибаюсь.Я только не понимаю разницу, которая делает третью точку, восемь символов.Я подумал, что это не нужно при использовании скобочной нотации, которая требуется здесь из-за имени атрибута.

Глядя на конечную цель использования его в утверждении набора тестов в SoapUI, следующее, вероятно, болееудобочитаемым и настраиваемым в долгосрочной перспективе (следовало бы рассмотреть это решение с groovy 4 часами ранее ...):

import groovy.json.JsonSlurper
jsonResponse = new JsonSlurper().parseText(context.response)
odatacount = "${jsonResponse.'@odata.count'}"
assert odatacount > 1
...