Вопрос или проблема
файл 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 для осуществления фильтрации. Это позволяет пользователям эффективно находить действия по различным параметрам.