[Android] Retrofit2 통신 오류 해결 : Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $
오늘은 제가 Android 앱 개발 중 REST 통신을 하다가 만난 오류를 포스팅해보려고 합니다!
제가 통신에 사용한 라이브러리는 Retrofit2와 Moshi(Object ↔ JSON) 입니다.
✨ Moshi가 궁금하신 분은 아래 포스팅을 참고해주세요!
🚩오류 - Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $
오류의 내용은 이렇습니다.
'com.squareup.moshi.JsonDataException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $'
→ BEGIN_OBJECT를 예상했지만 BEGIN_ARRAY 였다.
백엔드 개발자 친구가 준 JSON 예시는 아래와 같았습니다. 저는 이 GET 통신을 위해서 아래 이미지의 가장 큰 중괄호의 데이터를 POJO 클래스(위의 사진의 DayStudys 데이터 클래스; 문법 틀렸지만 편의상ㅎㅎ)로 만들었습니다.
// 통계(일간) - 끈기그래프
@GET("statics/{id}/{date}")
suspend fun getDailyGraphData(@Path("id") uid: String,
@Path("date") date: String): DayStudys
❇️ 오류 해결
제가 놓친 부분은 오류에서도 알 수 있었지만 바로 JSON의 형태였습니다.
위의 제 코드는 반환값이 DayStudys 객체로 JSON Object 였습니다. 하지만 백엔드 개발자 친구가 준 JSON 바디는 대괄호로 시작합니다. 즉, JSON Array 형태로 전달되는 것입니다.
// 통계(일간) - 끈기그래프
@GET("statics/{id}/{date}")
suspend fun getDailyGraphData(@Path("id") uid: String,
@Path("date") date: String): List<DayStudys>
따라서 List<> 컬렉션으로 해당 객체를 감싸주면서 JSON Array 받을 수 있도록 반환형을 변경하는 것으로 해결했습니다.
이번 오류는 JSON에 대한 저의 이해가 조금 부족했기 때문이 아닐까라고 생각이 듭니다😅
JSON Object
- 하나 이상의 key-value 쌍을 { }의 중괄호를 이용하여 담고 있는 객체 구조
- key : value의 형태로 구분은 colon( : )으로 함
- key-value의 구분은 comma( , )
- 순서 구분이 없음
JSON Array
- 배열 구조
- [ ]의 대괄호를 이용하여 값들을 담고, 값들의 구분은 comma( , )로 함
- index를 이용하여 값을 꺼낼 수 있으며, 순서를 고려해야 함
이번 오류로 JSON과 Moshi 라이브러리에 대한 이해를 더 잘 할 수 있었습니다!
다른 분들에게도 도움이 되었으면 좋겠습니다~🖐️