GSON으로 객체를 JSON으로 변환하기

Bluewave·2025년 6월 22일

안드로이드

목록 보기
14/14
post-thumbnail

루틴 자동화를 구성할 때, SmartThings API로 보내야 할 데이터는 대부분 JSON 형태로 구성된다.
하지만 앱 내부에서 상태는 Kotlin 객체로 관리하게 되니까,
이걸 JSON으로 바꾸는 직렬화 과정이 꼭 필요하다.

그럴 때 자주 쓰는 게 바로 Gson.


☝️ Gson이란?

Gson은 Google에서 만든 자바/코틀린용 JSON 직렬화/역직렬화 라이브러리다.

  • 직렬화(Serialization) : Kotlin 객체 → JSON 문자열
  • 역직렬화(Deserialization) : JSON 문자열 → Kotlin 객체

📦 왜 Gson을 써야 할까?

안드로이드 개발에서는 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에 보낼 수 있음.


🧪 Gson 적용 예시

  1. 의존성 추가 (build.gradle.kts 기준):
implementation("com.google.code.gson:gson:2.10.1")
  1. 객체 → JSON으로 변환
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이 됨!
  1. JSON → 객체로 역변환도 가능
val commandListType = object : TypeToken<List<Command>>() {}.type
val parsedList = gson.fromJson<List<Command>>(jsonString, commandListType)

✅ LUMOS에서 어떤 식으로 썼냐면

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만 받아도 어떤 기기를 어떻게 제어할지 알 수 있게 됨.


🧵 정리하면

기능예시 코드설명
객체 → JSONgson.toJson(obj)직렬화
JSON → 객체gson.fromJson(json, TypeToken<T>.type)역직렬화
프로젝트 적용커맨드 객체를 JSON으로 변환 후 API 전송API 통신 간소화

Gson"복잡한 객체를 간단하게 JSON으로 바꿔주는 도구"라고 생각하면 편하다.

profile
Developer's Logbook

0개의 댓글