티스토리 뷰
[Android] Retrofit com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ , NetworkResponse
데자와 맛있다 2023. 8. 14. 03:05프로젝트 하다가
fun createGroup(context: Context, uri: Uri, groupDto: Group) {
val groupImage = MultipartUtil.getImageBody(UriUtil.toFile(context, uri))
val groupDtoPart = gson.toJson(groupDto).toRequestBody("application/json".toMediaTypeOrNull())
viewModelScope.launch {
val response = repository.createGroup(groupDtoPart, groupImage)
val type = "그룹 생성에"
when (response) {
is NetworkResponse.Success -> {
Log.d(TAG, "createGroup: 성공 ${response.body}")
Log.d(TAG, "createGroup: 생성 성공~~~~~~~~~~~~~")
}
is NetworkResponse.ApiError -> {
Log.d(TAG, "createGroup: 실패 1 ${response.code}")
postValueEvent(0, type, _msgGroupCreate)
}
is NetworkResponse.NetworkError -> {
Log.d(TAG, "createGroup: 실패 2 ${response.error}")
postValueEvent(1, type, _msgGroupCreate)
}
is NetworkResponse.UnknownError -> {
Log.d(TAG, "createGroup: 실패 3 ${response.error}")
postValueEvent(2, type, _msgGroupCreate)
}
}
}
}
이런식으로 서버에 그룹 생성 요청 보내는게 있었음
응답이 정상인지 에러인지 알기위해서 NetworkResponse 얘를 쓰고있었음
얘는
sealed class NetworkResponse<out T: Any, out U: Any> {
data class Success<T: Any>(val body: T): NetworkResponse<T, Nothing>()
data class ApiError<U: Any>(val body: U, val code: Int): NetworkResponse<Nothing, U>()
data class NetworkError(val error: IOException): NetworkResponse<Nothing, Nothing>()
data class UnknownError(val error: Throwable?): NetworkResponse<Nothing, Nothing>()
}
이거임
근데 그룹 생성도 잘되고 응답도 200이 오는데 계속
이 부분이 실행됨 이유를 모르겠음
에러 로그는 이럼
com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path
MalformedJsonException을 해결하는 방법을 포스팅하겠습니다. Java에서 Json data를 처리하기 위해서 Gson library를 사용할 수 있습니다. Gson을 사용하다 보면 MalformedJsonException이 발생하는 경우가 있습니다.
3edc.tistory.com
이 블로그를 보니깐 gson을 사용하는데 gson에서 json을 처리하는데 RFC4627 을 지키지 않아서라고함
json data에 불필요한 띄어쓰기 있어도 그렇다고함
현재 해당 api에서 서버에서 응답으로 주는 값은 이러하다 ...
설마 이거 띄어쓰기 있어서 안되는거?
받는건 이렇게 GroupCreateResponse로 받는데 그냥 string으로 바꾸겠음 --> 안됨
다시 블로그를 자세히 읽겠음
보니깐 레트로핏 만들때 gson을 따로 설정해서 더 유연하게? 바꾸란다
이부분이 우리 프로젝트에서 레트로핏 만드는 부분임 원래 gson얘 없었는데 넣어주겠음
참고로 힐트를 사용한 의존성 주입이다 자세한건 아래 블로그에.. 그리고 나도 자세히 읽어봐야겠다
https://jminie.tistory.com/182
안드로이드 [Kotlin] - 프로젝트에 의존성 주입(DI) 적용해보기 - Hilt
의존성 주입, 안드로이드에서의 의존성 주입, 그리고 안드로이드 의존성 주입 라이브러리인 Hilt에 대해서 지난번 포스팅에서 다뤘다. https://jminie.tistory.com/180 안드로이드 [Kotlin] - 의존성 주입(DI)
jminie.tistory.com
뭐지 이렇게 했는데 안됨
아니 봐봐 200인데 에러가남
그리고 아까 gson 설정 안했을땐 서버 에러였는데 이젠또 알수없는 에러임
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
Gson 활용 중 만난 Expected BEGIN_OBJECT but was STRING
잘못된 json 형식이었던 것
velog.io
검색해보니 gson지는 오브젝트를 기대했는데 string이 왔다 이거임 아하..
그래서 다시 아까 받던
GroupCreateResponse를 string으로 변경
또안됨
이젠 또 이거란다
com.google.gson.JsonIOException: JSON document was not fully consumed.
https://devuryu.tistory.com/403
Retrofit2 이슈 - com.google.gson.JsonIOException: JSON document was not fully consumed.
이슈 retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall@dffd7f3 com.google.gson.JsonIOException: JSON document was not fully consumed. 원인 REST API 의 Response 형태가 json 형태가 아닌 String 형태로 내려올 경우에 발생한다.
devuryu.tistory.com
추가해주었다
드디어성공 ^.^ 레트로핏으로 맨날 json만 받아봐서 string을 못받는지는 몰랐네... 재밌는 경험이었다
'공부 > Android' 카테고리의 다른 글
[Wear] Health Service 정리 (0) | 2023.08.22 |
---|---|
[Watch] 헬스 데이터 사용법 조사.. (1) | 2023.08.20 |
[Compose] 데이터를 부르는 방법에 대한 고민 (0) | 2023.08.13 |
[플러터] iframe에서 데이터 가져오기 webViewx (0) | 2023.08.06 |
[Compose] LazyColumn안에 LazyColumn, Nested LazyColumn (1) | 2023.08.05 |