Как я могу получить значение больше, чем указанное значение в уверенности - PullRequest
1 голос
/ 13 мая 2019

Я новичок в Rest-Assured API с использованием Java. Я хочу извлечь количество дней, когда температура в городе выше 18. Использование openweathermap.org.

URL-адрес api.openweathermap.org/data/2.5/forecast?q=Sydney&units=metric&appid= enjAPP KEY}

Я получаю:

{ «треска»: «200», «сообщение»: 0,0067, "cnt": 40, "список": [ { "dt": 1557727200, "главный": { «темп»: 20,88, "temp_min": 20,88, "temp_max": 21,05, «давление»: 1025,56, "sea_level": 1025,56, "grnd_level": 1021,14, «влажность»: 57, "temp_kf": -0,17 }, "Погода": [ { "id": 803, "главная": "облака", "описание": "облачность", "icon": "04d" } ], "облака": { "все": 55 }, "ветер": { «скорость»: 3,45, "град": 43,754 }, "sys": { "стручок": "д" }, "dt_txt": "2019-05-13 06:00:00" }, { "dt": 1557738000, "главный": { «темп»: 18,45, "temp_min": 18,45, "temp_max": 18,58, «давление»: 1026,06, "sea_level": 1026.06, "grnd_level": 1021.28, «влажность»: 73, "temp_kf": -0,13 }, "Погода": [ { «id»: 804, "главная": "облака", "описание": "пасмурные облака", "icon": "04n" } ], "облака": { "все": 100 }, "ветер": { «скорость»: 3,84, "град": 28,267 }, "sys": { "pod": "n" }, "dt_txt": "2019-05-13 09:00:00" }, { "dt": 1557759600, "главный": { «темп»: 14,31, "temp_min": 14,31, "temp_max": 14,35, «давление»: 1026,29, "sea_level": 1026,29, "grnd_level": 1021,87, «влажность»: 80, "temp_kf": -0,04 }, "Погода": [ { «id»: 802, "главная": "облака", «описание»: «рассеянные облака», "icon": "03n" } ], "облака": { "все": 28 }, "ветер": { «скорость»: 1,66, «град»: 279,19 }, "sys": { "pod": "n" }, "dt_txt": "2019-05-13 15:00:00" },

}

Я не уверен, как мне продолжить итерации. Было бы здорово помочь, если бы кто-то смог мне помочь.

Я могу получить данные, но не уверен, как получить элемент из каждого массива

Теперь я хочу извлечь температуры выше 18 градусов

Я попытался сделать следующее:


public class WeatherForecast {

    public static Response resp;

    @Test
    public void getWeatherForecastForCity()
    {
        RestAssured.baseURI = "https://api.openweathermap.org";



        resp = given().
               param("q", "Sydney").
               param("units", "metric").
               param("appid", "670473f82ba0969a884be548c75236a4").
        when().
                get("/data/2.5/forecast").
        then().
                extract().response();

        List<String> temperatures = resp.getBody().jsonPath().getList("list");
        //String value = temperatures.getString()
        int count = temperatures.size();
        for(int i=0;i<=count;i++)

        {

        }
        System.out.println("List Size: "+temperatures.size());

        //assertEquals(temperatures, greaterThanOrEqualTo(20.00F));

        //String responseString = resp.asString();
        //System.out.println("Response String: "+responseString);
        //JsonPath js = new JsonPath(responseString);

        //Get the number of records for the city
        //int size = js.getList("list").size();
        //int temperature = Integer.parseInt(js.get("count"));
        //System.out.println("Temperature Value: "+js.getString("list[1].main.temp"));

    }

}

1 Ответ

2 голосов
/ 13 мая 2019

RestAssured использует мощную библиотеку под названием JsonPath, которую вы уже использовали.

Разница в том, что вы уже создали, заключается в том, как получить JSONObject / Array внутри другого JSONObject / Array

Вы использовали resp.getBody().jsonPath().getList("list");, что является почти хорошей отправной точкой. Вместо использования List<String> вы должны использовать List<HashMap<String, Object>>

Каждый HashMap<> будет объектом JSON.

Тогда вы можете просто перебрать массив, чтобы получить каждый объект и температуру.

Как это сделать:

List<HashMap<String, Object>> list = resp.getBody().jsonPath().getList("list");
for (HashMap<String, Object> jsonObject : list) {
    /**
    * Now, in order to get temperature, we have to get access to `main` element in JSON and then get access to the temperature
    **/
    HashMap<String, Object> mainElements = (HashMap<String, Object>) jsonObject.get("main");
    //No we have JSONObject as HashMap. We can access any temperature
    float temperature = (float) mainElements.get("temp");
    System.out.println(temperature);
}

Приведенный выше код напечатает все температуры. Теперь вам просто нужно сравнить значения с плавающей запятой, сохранить их, установить их или сделать все, что вы хотите:)

При таком подходе вы можете получить доступ к любому значению

EDIT: Извлеките приведенный выше код в метод, подобный этому:

    private List<HashMap<String, Object>> getJsonObjectsWithTempGreaterThan(JsonPath path, float degrees) {
        List<HashMap<String, Object>> desiredJsonObjects = new ArrayList<>();

        List<HashMap<String, Object>> list = path.getList("list");
        for (HashMap<String, Object> jsonObject : list) {
            HashMap<String, Object> mainElements = (HashMap<String, Object>) jsonObject.get("main");
            float temperature = (float) mainElements.get("temp");
            if (temperature > degrees) {
                desiredJsonObjects.add(jsonObject);
            }
        }

        return desiredJsonObjects;
    }

Приведенный выше код будет хранить каждый объект JSON в списке, а затем возвращать его. Список будет содержать объекты JSON с температурой, превышающей градусы, переданные в параметре.

Затем вы можете получить доступ к таким элементам, как это:

List<HashMap<String, Object>> objects = getJsonObjectsWithTempGreaterThan(path, 20);

Это наш список желаемых объектов. Если вы просто хотите температуру, все, что вам нужно сделать, это:

for (HashMap<String, Object> jsonObject : objects) {
    HashMap<String, Object> mainElements = (HashMap<String, Object>) jsonObject.get("main");
    //No we have JSONObject as HashMap. We can access any temperature
    float temperature = (float) mainElements.get("temp");
    System.out.println(temperature);
}

Это может быть достигнуто гораздо проще и читаемее с помощью Java Streams.

...