본문 바로가기
Android

Android] error : Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

by 김마리님 2024. 2. 5.

프로젝트 중 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가 생성된다.)

반응형