Health-Genie

[에러] JSON parse error

j9972 2024. 1. 6. 14:47
728x90

 

에러 내용

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

 

에러 원인 

해당 프로젝트는 Routine이라는 Entity안에 WorkoutRecipe라는 내장객체가 있는데, Routine 작성시 workoutRecipe가 null로 반환되는 문제가 있었다.

 

Routine entity

public class Routine {
	...

    @Embedded // 내장타입이다.
    private WorkoutRecipe workoutRecipe;
    
    ...
}

 

Routine Dto

public class RoutineRequestDto {
    private Long id;
    private Day day;
    private String parts;
    private List<WorkoutRecipe> workoutRecipe;
    private String writer; // 헬스 루틴 작성자 닉네임
}

 

위와 같이 DTO가 선언되어 있어 아래와 같이 postman에 test을 시도했는데, workoutRecipe가 NPE를 뱉었다

{
    "day" : "MONDAY",
    "parts" : "어깨",
    "name" : "a",
    "kg" : 2,
    "sets" : 2,
    "reps" : 2,
    "writer" : "예삐"
}

( 참고로, name, kg, sets, reps는 내장타입의 필드들이다. )

 

위를 보니까 당연하게 workoutRecipe로 묶지 않아서 NPE를 뱉을 수 밖에없었다 

 

그래서 2번째로는 아래와 같이 배열로 묶었는데 여기서 JSON parse error: Cannot deserialize value of type `java.util.ArrayList<>` from Object value (token `JsonToken.START_OBJECT`)] 이러한 에러가 발생했다

{
    "day" : "MONDAY",
    "parts" : "어깨",
    "workoutRecipe" : [
    	"name" : "a",
        "kg" : 2,
        "sets" : 2,
        "reps" : 2
    ],
    "writer" : "예삐"
}

 

문제가 POSTMAN에서 body로 데이터를 보낼때 형태가 잘못 지정되어 생긴 오류였다.....

 

해결 방안

결론은 아래와 같이 postman 에 데이터를 잘 보내야 한다

{
    //"level" : "EMPTY",
    "day" : "MONDAY",
    "parts" : "어깨",
    "workoutRecipe" : [
        {
            "name" : "사이드 레터럴 레이즈",
            "kg" : 20,
            "sets" : 2,
            "reps" : 15
        },
        {
            "name" : "페이스풀 ",
            "kg" : 20,
            "sets" : 2,
            "reps" : 15
        },
        {
            "name" : "밀리터리 프레스 ",
            "kg" : 20,
            "sets" : 2,
            "reps" : 15
        }
    ],
    "writer" : "33298325"
}

 

workoutRecipe마다 { } 로 묶어서 보내야한다!