예를 들어 TimeStamp 형식으로 수신되는 데이터를 LocalDateTime 으로 저장해야 하는 경우
역직렬화 클래스를 만들어 주어야 합니다.
LocalDateTime 이라는 class 를 역직렬화 하기 위해 JsonDeserializer 를 상속받은 Adapter class 를 만들어줍니다.
import com.google.gson.*
import java.lang.reflect.Type
import java.time.LocalDateTime
import java.time.ZonedDateTime
class TimestampConvertAdapter : JsonDeserializer<LocalDateTime> {
override fun deserialize(json: JsonElement, type: Type, jsonDeserializationContext: JsonDeserializationContext): LocalDateTime {
return ZonedDateTime.parse(json.asJsonPrimitive.asString).toLocalDateTime()
}
}
그리고 Gson 을 미리 전역으로 선언해두고 registerTypeAdapter() 메소드를 아래와 같이 이용해줍니다.
private val gson: Gson = GsonBuilder()
.registerTypeAdapter(LocalDateTime::class.java, TimestampConvertAdapter())
.create()!!
그리고 gson.fromJson() 로 Json 을 불러와주면, 상단 이미지와 같이 변환을 시켜 DataClass 에 매핑을 성공적으로 잘 시켜줍니다.
직렬화 예제로는 Enum 이 아래와 같이 되어있다면
enum class AuthorizationStatus(id: Int) {
Accepted(1),
Blocked(2),
Expired(3),
Invalid(4)
}
AuthorizationStatus 라는 키 데이터을 id 로 출력해 주어야 한다면, 이렇게 구성해봅시다.
import com.google.gson.JsonElement
import com.google.gson.JsonPrimitive
import com.google.gson.JsonSerializationContext
import com.google.gson.JsonSerializer
import java.lang.reflect.Type
import /* AuthorizationStatus Package Route */
class AuthorizationStatusAdapter : JsonSerializer<AuthorizationStatus> {
override fun serialize(src: AuthorizationStatus, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
return JsonPrimitive(src.id)
}
}
이렇게 구성해주면, gson.toJson() 에 매번 authorizationStatus.id 와 같이 해주지 않고 data class 에 열거형 값을 그대로 삽입해도, id 로 변환이 되어집니다.
import com.google.gson.jsonlement import com.google.gson.jsonPrimitive import com.google.gson.jsonserializationcontext import com.google.gson.jserializer import java.lang.reflect.type import / * AuthorizationStatus 패키지 경로 * / classStatusAdapter : jsonserializer <osporizationStatus> {FUN SERIALIZE 재정
반응형