t.me/atinfo_chat Telegram группа по автоматизации тестирования

Парсинг Json и добавление элементов в List

testng
selenium
webdriver
java
Теги: #<Tag:0x00007f21dd0c93c8> #<Tag:0x00007f21dd0c9260> #<Tag:0x00007f21dd0c9058> #<Tag:0x00007f21dd0c8f18>

(Necrosium) #1

Привет!

Ситуация следующая:
получаю по API String с айдишниками и балансом, преобразовываю его в jsonArray, прохожу по массиву и добавляю по ключу amount суммы в strList, затем преобразовываю strList в doubleList и суммирую все элементы doubleList чтобы получить общую сумму.

Хочу посоветоваться:

Реализую такое впервые, поэтому не уверен на счет правильности подхода. Возможно использую слишком много преобразований / перезаписей из одного вида в другой. Если есть вариант миновать некоторые преобразования и получить конечный результат, буду рад увидеть предложения


(Valentin G ) #2

Я бы рекомендовал полученный json преобрaзовать в list объектов (десериализовать) (сделать класс типа респонса), и потом уже из списка объектов доставать прямо double значения через его properties.


(Raynor) #3
  1. Нет смысла конвертить лист->стрим->лист->стрим->дабл, вы можете сделать сразу лист->стрим->дабл
strBalanceList.stream().map(Double::valueOf).map(Double::doubleValue).sum();

Что-то типа того. Не проверял на правильность синтаксиса - ваша часть работы :slight_smile:

  1. Не очень элегантно выглядит преобразование JSON строки в List.
    Рекомендую Gson
    Примеры
    https://www.lenar.io/json-to-array-list-gson-java/
    https://www.lenar.io/how-to-convert-json-to-java-object-with-gson/

(Necrosium) #4

переписал в итоге вот так:

getTotalBalance


(Raynor) #5

Ок, поскольку вывсе равно намерены использовать JSONArray, тогда можно вообще уйти от стримов и сделать все сразу во время первого прохода по массиву.

...
double sum = 0;
for (int i = 0; i < jsonArray.length(); i++) {
    String next = jsonArray.getJSONObject(i).getString("amount");
    sum += next == null ? 0 : Double.valueOf(next);
}
return sum;

Не тестил… Это на вас :slight_smile: