RequestMapping массив строк

Есть такой json, который приходит с фронта, внутри которого массив строк

[{"datebirth"="2022-02-01T00:00"},{"datebirth"="2022-02-01T00:00"}]

мне на бэке нужно его как-то принять и превратить в массив строк (может в ДТО), чтобы получить возраст этих людей, исходя из дат рождения. Как быть?

public ResponseEntity <><Object> Calculate(
    @RequestBody List<InsuredDTO> insuredDTO // если не ДТО принимать, тогда что? Как парсить?
    ) {
// ...
}

Заранее благодарю


Ответы (2 шт):

Автор решения: Nowhere Man

В 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;
}
→ Ссылка
Автор решения: LinKor

Большое спасибо, многое помогло. Сделал такой вот класс

@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 результат

→ Ссылка