프로젝트 중 Volley로 작성 된 코드가 있어 이를 Retrofit2로 변경하는 역할을 맡았다.
이 때 마주한 오류 중 하나가
Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
이다.
이 오류는 Gson 역직렬화 오류로, 유연하게 해석하면
Json으로 줄 줄 알았는데 Json 형식이 아니네? 우리가 해석할 수 있게 유연하게 해석하는걸 허가해줘!
이다.
맞다, 해당 프로젝트의 서버 Response의 형식은 JSON이 아니라 0, 1, 9999 ... 등으로 간단한 String만 날려주는 응답을 준다. 원래 Gson은 JSON의 형식을 엄격하게 지키기 때문에 이 형식에 의거하지 않으면 형식이 맞지 않다며 오류를 뱉어버리는 것이다..
따라서, 이들이 유연하게 직렬화 하는 것을 허가해줘야한다. 이를 허가해주는 위치는 처음 Retrofit을 선언하는 부분부터이다.
private val retrofit by lazy {
// 서버에서 JSON 형식 코드가 날아오지 않아서 유연한 파싱을 위해 포함
var gson= GsonBuilder().setLenient().create()
Retrofit.Builder()
.baseUrl("$baseUri/")
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
}
다음과 같이 setLeinent가 포함된 Gson 객체를 만들고 컨버터 팩토리를 생성할 때 넣어주면 된다. 그럼 더 이상 해당 오류와 조우하는 일이 사라진다.
(Gson을 넣어주지 않으면 디폴트 Gson으로 Factory가 생성된다.)
반응형
'Android' 카테고리의 다른 글
Mac] 사라진 Android File Transfer! 설치법 (0) | 2024.07.02 |
---|---|
WindowManager가 무엇일까? (0) | 2023.03.16 |
Android Studio, error ] > Build was configured to prefer settings repositories over project repositories but repository 'MavenRepo' was added by build file 'app\build.gradle' (0) | 2022.06.17 |
Android Studio] 구글 인앱 결제 개발 중 만나는 에러 (0) | 2022.05.18 |
카카오 API, Android] 키 해시 부여받기 (1) | 2021.08.31 |