ANDROID/Android 개발 이슈 & 해결

[Android] Retrofit2 통신 오류 해결 : Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $

주 녕 2022. 1. 4. 16:58
반응형

오늘은 제가 Android 앱 개발 중 REST 통신을 하다가 만난 오류를 포스팅해보려고 합니다!

제가 통신에 사용한 라이브러리는 Retrofit2Moshi(Object ↔ JSON) 입니다.

✨ Moshi가 궁금하신 분은 아래 포스팅을 참고해주세요!

 

[Android] Moshi를 이용한 Retrofit2 통신

최근 프로젝트를 하면서 서버와 통신하는 작업을 하게 되었습니다. 그래서 기존에 사용하던 Retrofit2와 GSON으로 작업을 진행하려고 했다가, 새롭게 사용할 라이브러리가 있을까하고 찾아보게 되

junyoung-developer.tistory.com

 

 

🚩오류 - 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 라이브러리에 대한 이해를 더 잘 할 수 있었습니다!

다른 분들에게도 도움이 되었으면 좋겠습니다~🖐️

반응형