Поиск через .json с использованием Spring

Вопрос или проблема

файл json с такими данными

[
  {
    "id": 25651,
    "title": "Немецкий тур: парламентский квартал и стеклянный купол Рейхстага",
    "price": 14,
    "currency": "$",
    "rating": 4.8,
    "specialOffer": false,
    "supplierId": 1
  },
  {
    "id": 6960,
    "title": "Пропуск линии: билеты в Пергамон музей Берлин",
    "price": 21,
    "currency": "$",
    "rating": 4.8,
    "specialOffer": false,
    "supplierId": 2
  }
]

и вот Activity.java, который сопоставляется с этим

import com.fasterxml.jackson.annotation.*;
import lombok.*;

@Data
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Activity {
    private Long id;
    private String title;
    private int price;
    private String currency;
    private double rating;
    private boolean specialOffer;
}

У меня есть ActivityController, который выглядит так

@GetMapping("/filter")
    public void filter(@RequestParam(name = "search", required = false, defaultValue = "NONE") String searchString, Model model) {
        try {
            model.addAttribute("searchString", searchString);
            //создать экземпляр ObjectMapper
            ObjectMapper objectMapper = new ObjectMapper();
            //читать JSON файл и преобразовать в список активностей
            var fileInputStream  = new ClassPathResource("static/activities.json").getInputStream();
            var activities = objectMapper.readValue(fileInputStream, new TypeReference<List<Activity>>() {
            });
            var filteredData = searchFilter(title, activities);
            System.out.println("filteredData = " + filteredData);
            model.addAttribute("activities", activities);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Если я хочу сделать запрос как /api/filter?search=german, и он должен пройти через все поля в Activity, как я могу этого добиться?

Спасибо за помощь

Ответ или решение

Для поиска через JSON файл в приложении на Spring, вам необходимо добавить функциональность, которая будет фильтровать данные по заданной строке поиска. В данном случае, мы будем перебирать все поля класса Activity и находить те, которые соответствуют запросу.

Шаг 1: Изменение метода фильтрации

Ваш текущий метод filter не содержит реализации поиска по полям Activity. Вам нужно создать метод searchFilter, который будет принимать строку для поиска и список объектов Activity, возвращая отфильтрованный список на основании ваших требований.

Вот пример того, как может выглядеть реализация searchFilter:

private List<Activity> searchFilter(String searchString, List<Activity> activities) {
    if ("NONE".equalsIgnoreCase(searchString) || searchString == null || searchString.isEmpty()) {
        return activities; // Если строка поиска пустая, возвращаем все активности
    }

    // Преобразование строки поиска в нижний регистр для сравнения
    String lowerCaseSearchString = searchString.toLowerCase();

    // Фильтруем список активностей
    return activities.stream()
            .filter(activity -> activity.getTitle().toLowerCase().contains(lowerCaseSearchString) ||
                               String.valueOf(activity.getId()).contains(lowerCaseSearchString) ||
                               String.valueOf(activity.getPrice()).contains(lowerCaseSearchString) ||
                               String.valueOf(activity.getRating()).contains(lowerCaseSearchString) ||
                               activity.getCurrency().toLowerCase().contains(lowerCaseSearchString))
            .collect(Collectors.toList());
}

Шаг 2: Обновление метода фильтрации в контроллере

Теперь обновите ваш метод filter в ActivityController, чтобы результат отфильтрованных данных отправлялся в модель:

@GetMapping("/filter")
public void filter(@RequestParam(name = "search", required = false, defaultValue = "NONE") String searchString, Model model) {
    try {
        model.addAttribute("searchString", searchString);
        ObjectMapper objectMapper = new ObjectMapper();
        var fileInputStream = new ClassPathResource("static/activities.json").getInputStream();
        var activities = objectMapper.readValue(fileInputStream, new TypeReference<List<Activity>>() {});

        // Получаем отфильтрованные данные
        var filteredData = searchFilter(searchString, activities);
        System.out.println("filteredData = " + filteredData);

        // Добавляем отфильтрованные данные в модель
        model.addAttribute("activities", filteredData);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Шаг 3: Тестирование

Теперь, когда вы запустите ваше приложение и выполните запрос, например, /api/filter?search=german, метод filter будет вызывать searchFilter, который вернет список объектов Activity, где title, id, price, rating, или currency содержат слово "german".

Заключение

Таким образом, вы можете легко добавлять функциональность поиска в ваше Spring-приложение, используя Jackson для обработки JSON, и Stream API для осуществления фильтрации. Это позволяет пользователям эффективно находить действия по различным параметрам.

Оцените материал
Добавить комментарий

Капча загружается...