IT 정보/스프링 부트

JSON parse error: Cannot deserialize value of type

nagrang 2025. 12. 30. 16:30

 

Springboot에서 @RequestBody 어노테이션을 사용하여 http body를 받는데 파싱 에러가 난다. 

 

JSON parse error: Cannot deserialize value of type `java.util.ArrayList<uj.notion.dto.BlockRequestDto>` from Object value (token `JsonToken.START_OBJECT`)]

에러 문구를 보면 parse error가 나서 json을 객체로 바꾸지 못하고 있다. DTO 정의가 잘못 된 것 같다.

 

현재 controller단 로직은 이렇다.

@PutMapping("/api/block")
public ResponseEntity<Void> saveBlock(@RequestBody BlockRequestDto rootBlock){
    System.out.println("Type: " + rootBlock.getType());

    if (rootBlock.getContent() != null) {
        System.out.println("자식 블록 개수: " + rootBlock.getContent().size());
    }
    return ResponseEntity.ok().build();
}

 

fe에서 넘겨주는 json 형식은 다음과 같다.

 

content에 한 번 감싸져서 들어오고 있다. 

 

근데 내가 서버에서 받는 방식은 바로 안쪽 데이터에 접근하고 있었다. 즉 문제는 Json 형식과 매핑할 객체의 구조가 맞지 않아서이다. 

@Getter
@Setter
@NoArgsConstructor
@ToString
public class BlockRequestDto {
    private String type;
    private List<BlockRequestDto> content = new ArrayList<>();
    private String text;

}

 

해결 방법은 Json 구조와 일치하도록 BE에서 BlockRequestDto를 감싸는 껍데기 DTO를 하나 더 만들거나, FE에서 content 데이터를 열어서 보내면 된다.

 

방법1. BE에서 해결

BlockRequestDto는 유지한 채 껍데기를 하나 만들어준다.

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class TaskPayloadDto {

    private BlockRequestDto content; 
}

 

 

방법2. FE에서 해결

- FE에서 API 요청할 때 payload에서 playload.content로 보낸다.

export const updateTaskContent = async (id: string, payload: any) => {
    try{
        const rest = await apiClient.put(`/api/block`, payload.content)
        console.log("[put]/block :", rest.data)
        return rest.data;
    } catch (err: any){
        const errorMessage = err.response?.data?.message || "[put]/block";
        console.error("요청 실패:", errorMessage);
    }
}

 

그럼 무사히 파싱 성공한다.

 

@RequestBody 에러를 만난 김에 다음 포스팅에서 @RequestBody에 대해 알아보자.

2025.12.30 - [IT 정보/스프링 부트] - @RequestBody란?

 

@RequestBody란?

핵심@RequestBody는 HTTP 요청 본문에 담긴 데이터를 자바의 객체로 변환(역직렬화)해주는 역할을 한다.이때 안쪽 로직에서는 HttpMessageConverter 인터페이스와 Jackson 라이브러리가 사용된다. 작동 원리

uzinlab.tistory.com

 

'IT 정보 > 스프링 부트' 카테고리의 다른 글

[Spring Framework] Spring Web MVC  (0) 2026.01.08
@RequestBody란?  (1) 2025.12.30
[Spring] SOLID 원칙을 지켜보자  (1) 2024.03.26
[Spring] h2적용 후 postman으로 테스트하기  (0) 2024.02.22
스프링 : 빈 등록하기  (0) 2023.12.14