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 두가지 해결책이 있습니다.
- Server에서 Json형식을 규격에 맞게 고치기
- 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 구문 분석기가 허용하는 범위가 넓어집니다.
'Java' 카테고리의 다른 글
[Java] byte array to String, String to byte array (0) | 2021.09.03 |
---|---|
[Java] InputStream을 byte 배열(byte[])로 변환 (0) | 2021.09.02 |
[Java] Ping 보내는 방법 InetAddress.isReachable() (0) | 2021.09.02 |
[Java] Float, Double 크기 비교(compare) (0) | 2021.08.29 |
[Java] String startsWith(), EndsWith() 구현 예제 (0) | 2020.07.20 |
[Java] JSONArray에서 JSONObject 값 얻어오기 (0) | 2020.07.12 |
[Java] java.lang.ArrayIndexOutOfBoundsException (0) | 2020.06.13 |
Java String을 int로 변환, int를 String으로 변환 - String to int, int to String (0) | 2020.05.27 |