Java

com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ 해결하기

Darane 2021. 9. 2. 13:37

MalformedJsonException을 해결하는 방법을 포스팅하겠습니다.

 

Java에서 Json data를 처리하기 위해서 Gson library를 사용할 수 있습니다. Gson을 사용하다 보면 MalformedJsonException이 발생하는 경우가 있습니다.

 

Restful API를 지원하는 서버와 통신하기 위해서 Retrofit/Gson을 사용하는 경우에도 발생할 수 있습니다.

Retrofit에서 request/response body의 Json 객체를 처리하기 위해서 어떤 json libarary를 선택할 수 있는데

Retrofit 예제 코드에도 나와있듯이 gson을 많이 사용합니다. Retrofit, gson을 사용할 때 발생할 수 있습니다.

 

MalformedJsonException이 발생한 이유는 gson에서 Json을 처리할 때 Json형식의 RFC 4627을 엄격하게 지키지 않을 경우 발생합니다. Json data에 불필요한 값이나 띄어쓰기 있는 경우 발생할 수 있습니다.

 

 

 

 

 

MalformedJsonException  두가지 해결책이 있습니다.

 

  1. Server에서 Json형식을 규격에 맞게 고치기
  2. Client에서 Exception 문구에 나와있는 것처럼 setLeinet를 사용하는 방법

Client에서 Exception을 해결하는 방법을 알아보겠습니다.

예제와 같이 GsonBuilder().setLenient()를 사용하면 문제가 해결됩니다.

 

예제

Gson gson = new GsonBuilder()
        .setLenient()
        .create();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(url)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();

 

setLeninet() 함수는 설정하면 엄격한 규칙을 적용하지 않고 조금 더 유연하게 분석을 합니다.

API document를 보면 아래와 같이 설명하고 있습니다.

 

함수

public GsonBuilder setLenient()

기본적으로 Gson은 엄격(strict)하고 RFC 4627에 지정된 JSON만 허용합니다. 이 옵션을 사용하면 Json 구문 분석기가 허용하는 범위가 넓어집니다.

반응형