Есть ли способ найти значение элемента ответа JSON на основе другого значения элемента?

Используя приведенный ниже метод, я мог получить значение элемента «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*",

person Tareq Shams    schedule 01.07.2019    source источник
comment
что вы имеете в виду под «на основе другого значения элемента»? Что вы пытаетесь достичь?   -  person arnonuem    schedule 01.07.2019
comment
ответ, который я получаю, имеет несколько подарков, и каждый из них имеет id, мне нужно получить значение id для этого конкретного подарка. nameEn, обратите внимание, что у меня уже есть значение подарков .nameEn и я не могу отправить его в запросе   -  person Tareq Shams    schedule 01.07.2019
comment
@TareqShams Посмотрите мой ответ. Мне удалось получить идентификатор на основе gifts.nameEn   -  person Fenio    schedule 01.07.2019
comment
@Fenio это работает как шарм, и я принял ваш ответ, еще раз спасибо :)   -  person Tareq Shams    schedule 01.07.2019


Ответы (1)


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 Streams. Все, что подходит вам больше всего.

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

1222

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

EDIT: Если вы получаете исключение, подобное этому, невозможно десериализовать объект из-за отсутствия десериализатора JSON, найденного в пути к классам. Пожалуйста, укажите Jackson (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>
person Fenio    schedule 01.07.2019
comment
@TareqShams Примите мой ответ, пожалуйста :) См. как - person Fenio; 01.07.2019