-
[Retrofit] NumberFormatException 해결방법 - 레트로핏으로 자료형 두 개 처리하기프로그래밍/Android 2023. 2. 23. 11:38
Data Class에 Double로 정의를 해놨는데 Json으로부터 오는 값의 자료형이 String으로 올 때도 있어서 NumberFormatException이 발생하는 이슈가 있었다. Double이거나 Null이었다면 Nullable 처리를 해주면 그만이었겠지만 값이 없을 경우 Empty String을 내려주니 Exception이 발생할 수 밖에 없었던 것이다. 해결방법은 GsonConverter에 예외처리를 담당하는 Adapter를 추가함으로써 해결할 수 있었다. 구글링해서 찾은 것이므로 다른 분들과 코드가 중복될 수도 있다.
package com.tenfingers.core.network import com.google.gson.JsonSyntaxException import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter import timber.log.Timber import java.io.IOException class EmptyStringToNumberTypeAdapter : TypeAdapter<Number?>() { @Throws(IOException::class) override fun write(jsonWriter: JsonWriter, number: Number?) { if (number == null) { jsonWriter.nullValue() return } jsonWriter.value(number) } @Throws(IOException::class) override fun read(jsonReader: JsonReader): Number? { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull() return null } val value = jsonReader.nextString() return try { if ("" == value) { 0.0 } else value.toDouble() } catch (e: NumberFormatException) { throw JsonSyntaxException(e) } catch (e: IllegalStateException) { Timber.d("IllegalStateException -> $value") return 0.0 } } }
해당 아답터에서 Double을 받으려고 했는데 Empty String이 왔을 경우 0.0으로 변경해주고 toDouble로 변경해주는 역할을 해준다. 해당 Adapter를 GsonConverter에 추가만 해주면 이슈는 해결된다.
GsonBuilder() .registerTypeAdapter(Double::class.java, EmptyStringToNumberTypeAdapter()) .create()
해당 GsonConverter를 아래와 같이 추가해준다.
Retrofit.Builder() .baseUrl(host) .client(okHttpClient) .addCallAdapterFactory(ApiResponseCallAdapterFactory.create()) .addConverterFactory(gsonConverter) .build()
문제 해결 :)
'프로그래밍 > Android' 카테고리의 다른 글
[Android] Paging 라이브러리 구성요소 (0) 2022.05.21 [Codelabs Tutorial] Android 앱에서 Hilt 사용해보기 (4) with EntryPoint (0) 2022.05.19 [Codelabs Tutorial] Android 앱에서 Hilt 사용해보기 (3) with 한정자/UI테스트 (0) 2022.05.16 [Codelabs Tutorial] Android 앱에서 Hilt 사용해보기 (2) (0) 2022.05.10 [Codelabs Tutorial] Android 앱에서 Hilt 사용해보기 (1) (0) 2022.05.10