루틴 자동화를 구성할 때, SmartThings API로 보내야 할 데이터는 대부분 JSON 형태로 구성된다.
하지만 앱 내부에서 상태는 Kotlin 객체로 관리하게 되니까,
이걸 JSON으로 바꾸는 직렬화 과정이 꼭 필요하다.
그럴 때 자주 쓰는 게 바로 Gson.
Gson은 Google에서 만든 자바/코틀린용 JSON 직렬화/역직렬화 라이브러리다.
직렬화(Serialization) : Kotlin 객체 → JSON 문자열역직렬화(Deserialization) : JSON 문자열 → Kotlin 객체안드로이드 개발에서는 Retrofit2와 함께 많이 쓰인다.
특히 IoT API나 외부 서버와 통신할 때, JSON으로 데이터를 주고받아야 하기 때문.
예를 들어 루틴 자동화를 만들 때 이런 구조가 필요했음:
[
{
"component": "main",
"capability": "switchLevel",
"command": "setLevel",
"arguments": [70]
}
]
근데 앱 내부에서는 이걸 Command 객체로 들고 있었기 때문에:
data class Command(
val component: String,
val capability: String,
val command: String,
val arguments: List<Any>
)
→ 이걸 JSON 문자열로 바꿔줘야 API에 보낼 수 있음.
build.gradle.kts 기준):implementation("com.google.code.gson:gson:2.10.1")
val commands = listOf(
Command("main", "switchLevel", "setLevel", listOf(70)),
Command("main", "switch", "on", emptyList())
)
val gson = Gson()
val jsonString = gson.toJson(commands)
Log.d("Lumos", jsonString)
// → SmartThings API로 보낼 JSON이 됨!
val commandListType = object : TypeToken<List<Command>>() {}.type
val parsedList = gson.fromJson<List<Command>>(jsonString, commandListType)
LUMOS에서는 사용자가 조명, 공기청정기, 스피커 상태를 설정하면
→ 기기별 커맨드 파서가 이를 List<Command> 형태로 만들어주고
→ 이걸 Gson으로 직렬화해서 서버에 저장하거나 API로 전송했음.
val lightCommands = LightCommandParser().parse(brightness = 60, isOn = true)
val commandDevice = CommandDevice(deviceId = "123", commands = lightCommands)
val commandJson = gson.toJson(commandDevice)
이렇게 만들면 서버에서는 JSON만 받아도 어떤 기기를 어떻게 제어할지 알 수 있게 됨.
| 기능 | 예시 코드 | 설명 |
|---|---|---|
| 객체 → JSON | gson.toJson(obj) | 직렬화 |
| JSON → 객체 | gson.fromJson(json, TypeToken<T>.type) | 역직렬화 |
| 프로젝트 적용 | 커맨드 객체를 JSON으로 변환 후 API 전송 | API 통신 간소화 |
Gson은"복잡한 객체를 간단하게 JSON으로 바꿔주는 도구"라고 생각하면 편하다.