반응형
API 통신 로직을 구성하다 보면 경우에 따라 다른 형식으로 내려오는 Attributes 필드가 존재하는 경우가 있습니다.
유연하게 수신받아 처리하기 위해서 Retrofit에 리플렉션 처리를 추가하는 방법도 있겠지만 단순하게 Any Type Value를 가지는 Map을 데이터 클래스로 반환하는 방법에 대해 알아보겠습니다.
data class Result(
val isSuccess: Boolean,
val data: HashMap<String, Any>
)
위와 같이 Response 데이터 클래스를 지정했다면 어떤 타입 스타일이 들어올지 모르지만 어차피 수신되는 데이터의 기본 형태는 <Key : Value> 형태이므로 Map을 지정해 줍니다.
그리고 로직에서 필요한 Attributes의 스타일들을 데이터 클래스로 구성합니다.
data class AttributesFirst(
val id: Int,
val name: String,
val url: String
)
data class AttributesSecond(
val id: Int,
val label: String,
val score: Double
)
이제 실제로 Response 데이터가 아래처럼 수신되었다고 가정해 보겠습니다.
val hashMap = mutableMapOf<String, Any>()
hashMap["id"] = 1
hashMap["name"] = "Adam"
hashMap["url"] = "https://www.naver.com"
어떤 경우에 위와 같은 형식이 내려오는지 그 케이스는 호출하는 클라이언트 입장에서 알 수 있어야 합니다.
그를 기준으로 변환할 데이터 클래스를 지정할 수 있겠습니다.
그래서 위의 데이터 내용을 확인하고 형식에 알맞은 AttributesFirst 클래스로 Gson을 활용하여 변환합니다.
// Map을 JSON 문자열로 변환
val gson = Gson()
val json = gson.toJson(hashMap)
// JSON 문자열을 데이터 클래스로 변환
val user: AttributesFirst = gson.fromJson(json, AttributesFirst::class.java)
println("Converted User: $user")
Converted User: AttributesFirst(id=1, name=Adam, url=https://www.naver.com)
반응형