-
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 15 path $.documents개발/삽질 기록 2021. 3. 15. 18:23
안드로이드 개발중 Gson과 Retrofit을 이용해 Json 데이터를 주고 받을 때 이런 에러를 보게 되는 경우가 있다
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 15 path $.documents at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
이 에러는 서버로 부터 전달 받은 타입과 내가 예상한 타입이 맞지 않아서 발생하는 문제다. 특히 위 에러는 나는 Object가 올것으로 기대 했는데 실제 데이터가 배열인 경우다. 아래 코드를 보면 나는 검색 결과에 대한 클래스에서 documents 인자를 하나의 오브젝트로 받고 있다.
interface LibraryApi { @GET("/v3/search/book") fun search( @Query(value = "query") query: String, @Query(value = "sort") sort: String?, @Query(value = "page") page: Int?, @Query(value = "size") size: Int?, @Query(value = "target") target: String? ): Single<SearchResp> } @Keep data class SearchResp(val documents: BookMeta, val meta: SearchMeta)
그런데 실제 서버로부터 응답은 documents는 하나의 오브젝트가 아니라 배열로 날라온다. 클라이언트에서 기대한 데이터 타입이 달라서 발생하는 에러다.
{ "documents": [ { "authors": [ "전석" ], "contents": "주식투자의 성공 요소 중 중요한 것은 바로 수익을 낼 수 있는 종목을 볼 줄 아는 눈을 갖는 것이다. 지금 상승하거나 혹은 상승을 준비 중인 종목들이 본격적으로 상승하기 전에, 세력은 어쩔 수 없이 흔적을 남기게 된다. 『개미대학 세력의 매집원가 구하기』는 그런 종목을 구별해 낼 줄 아는 능력을 키울 수 있게 한다. 처음 기술적 분석을 공부하다가 힘들다고 포기하는 부분이 바로 '캔들과 거래량'인데, 이것을 실전에 적용하려면 암기가 아닌 원리의 이해가", "datetime": "2017-0
'개발 > 삽질 기록' 카테고리의 다른 글
vscode 유용한 단축키 (0) 2022.02.11 kotlin data class 는 상속을 가능하면 쓰지 말자 (0) 2021.12.08 git 에 올라간 파일 이름 확인하기 (0) 2021.01.26 cannot find module - heroku (0) 2021.01.10 error: internal/modules/cjs/loader.js:883 (0) 2020.12.14