[Error] Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

Minji Jeong·2022년 5월 14일
2

Troubleshooting

목록 보기
9/20
post-thumbnail

문제

val retrofit= Retrofit.Builder()
        .baseUrl("https://openapi.foodsafetykorea.go.kr/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(okHttpClient)
        .build()

나의 경우 retrofit을 사용해서 서버로부터 값을 받아오던 중 종종 발생했다. 계속 발생하는 오류는 아니였으나 거슬릴 정도였기 때문에 빠르게 문제를 해결해야 했다. 오류 구문을 직역해보면 'JsonReader.setLeninet(true)를 사용해 해당 경로에서 잘못된 JSON을 허용해라' 인데, 오류 내용 그대로 구글링을 했더니 나와 동일한 오류를 겪고 있는 사람들이 꽤 많았다. 해결하는데 도움이 된 StackOverFlow 질문글과 블로그를 아래 링크에 첨부해두겠다 👍

🚨 https://stackoverflow.com/questions/39918814/use-jsonreader-setlenienttrue-to-accept-malformed-json-at-line-1-column-1-path
🚨 https://kmight0518.tistory.com/87

해결

먼저 retrofit 객체를 만들 때 setLenient()를 추가한 GSON 객체를 GsonConverterFactory.create()의 파라미터로 전달해 해결하는 방법이 있다. GSON은 원래 FC 4627에 의해 구체화된 JSON 만 허용할 정도로 엄격하지만, setLenient 속성을 설정하면 parser로 하여금 허용을 더 자유롭게 해준다고 한다.

var gson= GsonBuilder().setLenient().create()

val retrofit= Retrofit.Builder()
        .baseUrl("https://openapi.foodsafetykorea.go.kr/")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(okHttpClient)
        .build()
🔔 GSON ?
Java 객체를 JSON으로 변환하는데 사용할 수 있는 Java 라이브러리로, 그 역기능도 가능하다.

나는 위 방법으로 해결을 했지만, 글을 더 찾아보니 앞서 말했던 해결 방법으로도 해결을 못하는 경우가 있는 것으로 보아 저 방법이 본질적인 해결책은 아닌 것 같다.


위 사진은 StackOverFlow의 해당 글 질문자가 업데이트한 글과 또다른 답변이다. 이 에러는 JSON 문제가 아닌, 서버 요청 시 잘못된 헤더를 사용했거나 결과값이 JSON이 아닌 다른 형태(ex HTML)인 것이 이 문제의 근본적인 원인이라고 주장했다. 따라서 만약 GSON 객체를 추가하는 방법으로 해결되지 않는다면, API 테스트 플랫폼인 POSTMAN에서 서버 요청이 제대로 이루어지는지 테스트를 해보고, 그래도 안되면 결과값이 다른 형태는 아닌지 확인해보자.

profile
Mobile Software Engineer

0개의 댓글