공부/Android

[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이 오는데 계속

이 부분이 실행됨 이유를 모르겠음

에러 로그는 이럼

https://3edc.tistory.com/52

 

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 $

 

 

https://velog.io/@myway00/Gson-%ED%99%9C%EC%9A%A9-%EC%A4%91-%EB%A7%8C%EB%82%9C-Expected-BEGINOBJECT-but-was-STRING

 

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을 못받는지는 몰랐네... 재밌는 경험이었다