Есть ли способ найти значение элемента ответа JSON на основе другого значения элемента? - PullRequest
0 голосов
/ 01 июля 2019

Используя приведенный ниже метод, я могу получить значение элемента " id " (первый элемент в первом списке). мне нужно получить значение этого элемента, но на основе состояния другого элемента " gifts.nameEn "

Response response = request.post("/pop/transaction/inquiry");
JsonPath jsonPathEvaluator = response.jsonPath();

List<HashMap> activeCampaignsList = jsonPathEvaluator.getList("");
for(int i=0; i< activeCampaignsList.size(); i++)
{
        offerId = activeCampaignsList.get(i).get("id").toString();
        break;
}

А вот фрагмент ответа, чтобы вы знали, что именно я ищу:

[ { "**id**": 1222, "type": "WITHIN_TRANSACTION", "gifts": [ { "startDate": "2019-06-26", "endDate": "2019-06-26", "id": 26130, "nameAr": "abcd201957261140057", "nameEn": "*abcd201957261140057*",

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Предположим, у вас есть следующий json в ответ:

[  
   {  
      "**id**":1222,
      "type":"WITHIN_TRANSACTION",
      "gifts":[  
         {  
            "startDate":"2019-06-26",
            "endDate":"2019-06-26",
            "id":12345,
            "nameAr":"abcd201957261140057",
            "nameEn":"xyzd201957261140057"
         },
         {  
            "startDate":"2019-06-26",
            "endDate":"2019-06-26",
            "id":54321,
            "nameAr":"abcd201957261140057",
            "nameEn":"qwed20333361140057"
         },
         {  
            "startDate":"2019-06-26",
            "endDate":"2019-06-26",
            "id":26135,
            "nameAr":"abcd201957261140057",
            "nameEn":"abcd20195724447"
         }
      ]
   }
]

Чтобы получить идентификатор объекта, который имеет "nameEn": "abcd20195724447" , вы можете сделать:

Response response = request.post("/pop/transaction/inquiry");
JsonPath jsonPathEvaluator = response.jsonPath();
jsonPathEvaluator.getInt("[0].gifts.find { it.nameEn == 'abcd20195724447' }.id")
0 голосов
/ 01 июля 2019

RestAssured позволяет использовать JsonPath, что имеет сильную полезность при обработке JSON. Вместо того, чтобы работать с путями, вы можете преобразовать JSON в объекты Java, и я покажу вам, как это сделать.

Итак, ваш JSON начинается с массива элементов. Каждый элемент является объектом JSON. Каждый объект JSON содержит вложенный массив JSON gifts с объектами JSON. Позвольте мне объяснить подробнее.

Сначала мы должны обработать массив, начало вашего JSON [. Для этого мы можем создать класс, представляющий этот массив следующим образом:

public class ElementObject { //this name is irrelevant. You can call it whatever you want
    public String id; //the names of the variables are relevant
    public String type; //each of variable name corresponds to the type and name in the JSON
    public List<GiftObject> gifts; //here we handle the nested JSON Array of JSON Objects
}

Теперь нам нужен объект для обработки gifts. Для этого потребуется еще один класс:

public class GiftObject { //irrelevant name
    public String startDate; //relevant name
    public String endDate;
    public String id;
    public String nameAr;
    public String nameEn;
}

Теперь все, что нам нужно сделать, это вызвать метод 1 из JsonPath, чтобы проанализировать весь JSON в классы Java. Как это:

response.jsonPath().getObject("", ElementObject[].class);

Это в основном так. Начиная сверху:

[  
   {  
      "id":1222,
      "type":"WITHIN_TRANSACTION",

У нас есть массив JSON с объектами JSON. 1 объект JSON равен 1 экземпляру класса ElementObject. Все объекты из массива будут проанализированы в ElementObject[].class, и JsonPath создаст экземпляр, используя Java Reflection (вам не нужно об этом беспокоиться).

"gifts": [ { "startDate": "2019-06-26", "endDate": "2019-06-26", "id": 26130, "nameAr": "abcd201957261140057", "nameEn": "abcd201957261140057",

Каждый из подарков будет разобран в новый экземпляр GiftObject и сохранен в List<GiftObject> в ElementObject классе.

Все, что нам нужно сделать сейчас, - это работать над нашими классами Java.

Чтобы полностью ответить на ваш вопрос - вам нужно значение идентификатора, основанное на gifts.nameEn

for (ElementObject element : elements) {
            for (GiftObject gift : element.gifts) {
                if (gift.nameEn.equals("abcd201957261140057")) {
                    System.out.println(element.id);
                }
            }
        }

Указанный выше цикл for можно легко заменить методом или потоком Java. Все, что подходит вам больше всего.

Учитывая приведенный выше код, результаты будут:

1222

Надеюсь, это поможет!

EDIT: Если вы получили исключение, подобное этому, Невозможно десериализовать объект из-за отсутствия десериализатора JSON в classpath. Пожалуйста, поместите Джексона (Databind) или Gson в путь к классам. все, что вам нужно сделать, это добавить jackson-databind в Maven. Rest Assured может использовать привязку данных Gson или Jackson для преобразования JSON в классы Java. Все, что вам нужно, это зависимость, и все готово.

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
...