RequestMapping массив строк
Есть такой json, который приходит с фронта, внутри которого массив строк
[{"datebirth"="2022-02-01T00:00"},{"datebirth"="2022-02-01T00:00"}]
мне на бэке нужно его как-то принять и превратить в массив строк (может в ДТО), чтобы получить возраст этих людей, исходя из дат рождения. Как быть?
public ResponseEntity <><Object> Calculate(
@RequestBody List<InsuredDTO> insuredDTO // если не ДТО принимать, тогда что? Как парсить?
) {
// ...
}
Заранее благодарю
Ответы (2 шт):
В JSON ключи и значения разделены двоеточием :, а не знаком равенства =.
Если принять, что данная строка всё-таки представляет корректный JSON, то она может быть автоматически преобразована в список объектов, то есть по большому счёту задача сводится к написанию DTO класса, например, при помощи @Data аннотации проекта Lombok (или же сгенерировать методы доступа, метод toString самостоятельно):
@Data
public class AgeDto {
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm")
private LocalDate datebirth;
}
Получить возраст из даты рождения можно так:
public int getAge(LocalDate) {
return Period.between(datebirth, LocalDate.now()).getYears();
}
Так что список AgeDto можно вывести в таком виде:
// String json = "[{\"datebirth\":\"1980-09-07T00:00\"},{\"datebirth\":\"2000-01-01T00:00\"}]";
List<AgeDto> input = ...;//
input.stream()
.forEach(dto -> System.out.printf("DOB: %s, age=%d yrs%n",
dto.getDatebirth(), getAge(dto.getDatebirth())
));
// -> DOB: 1980-09-07, age: 41 yrs
// -> DOB: 2000-01-01, age: 22 yrs
Для возврата какого-то общего результата:
public int getCalculation(List<AgeDto> ages) {
return ages.stream()
.mapToInt(AgeDto::getAge) // IntStream
.map(age -> age < 18 ? 200 : 100)
.sum();
}
Или же при помощи цикла:
public int getCalculation(List<AgeDto> ages) {
int result = 0;
for (AgeDto dto : ages) {
result += dto.getAge() < 18 ? 200 : 100;
}
return result;
}
Большое спасибо, многое помогло. Сделал такой вот класс
@Data
@Component
public class AgeDTO {
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm")
public LocalDate dateOfBirth;
public int getAge() {
return Period.between(this.dateOfBirth, LocalDate.now()).getYears();
}
у меня нет стримов. Вот сервисный слой:
AgeDTO ageDTO;
private int age = insuredDTO.getAge();
@Transactional
public double getCalculation(List<AgeDTO> ageDTO) {
return ?????????
}
мне нужно как то здесь пройтись по всем объектам в листе - высчитать их возраст. Например если возраст больше 18 - возвращаем 100, если меньше 18 - возвращаем 200. Потом складываем полученные цифры и возвращаем int результат