본문 바로가기

안드로이드/[Kotlin]

[Kotlin] Intent 에 JSON string 담아서 전송 (Feat. Gson)

이 글  에서 액티비티 사이에서 Intent 로 데이터를 주고 받았다.

intent 관련 코드를 보자.

intent.putExtra("title", song.title)
intent.putExtra("singer", song.singer)
intent.putExtra("isPlaying", song.isPlaying)

보내야 할 song 객체의 정보가 3가지이다.

그런데 웬걸, 코딩을 하다보니 song 객체에 넣어야 할 값이 점점 많아졌다.

 

//song.kt

data class Song(
    var title : String = "",
    var singer : String = "",
    var totalTime : Int = 0,
    var currentTime : Int = 0,
    var isPlaying : Boolean = false,
    var musicFile : String = ""
)

현재의 Song 데이터클래스 상태이다. 6가지라니,...

 

intent로는 객체를 바로 전송할 수 없기에 처음에는 값 하나하나를 일일이 다 넣어줬다.

그런데 하다보니 너무 비효율적이라는 생각이 들어서 알아 본 결과,,,,

 

Google 에서 제공하는 Gson 라이브러리가 있었다.

Gson은 Json 데이터를 좀 더 효율적으로 가공하고 관리할 수 있도록 도와주는 라이브러리이다.

 

우리는 Gson 을 통해 Song 객체를 Json string 형태로 바꾼 뒤에 intent 객체에 담아 줄 예정이다.

 

 

// SongActivity.kt

class SongActivity : AppCompatActivity() {
    private var song : Song = Song()

    private lateinit var jsonSong : String 
    // song 객체를 json 형태로 변환해서 저장 (string으로 저장)

    private var gson : Gson = Gson()
    
    override fun onBackPressed(){
        intent = Intent(this, MainActivity::class.java)
        jsonSong = gson.toJson(song)
        intent.putExtra("jsonSong", jsonSong)
        setResult(RESULT_OK, intent)
        finish()
    }
}

song 객체를 gson.toJson(song)  코드를 통해  Json 형태로 변환 해 준다.

변환 한 결과값의 변수 타입은 String 형태이므로 intent로 String 을 보내 준다고 생각하면 된다.

 

 

 

//MainActivity.kt

getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
  if(result.resultCode == RESULT_OK) {
    Log.d("intent에 담겨온 data", "${result.data!!}")   //result.data 를 intent 라고 생각
    //intent에 담겨온 data: Intent { cmp=com.example.flo/.MainActivity (has extras) }

    jsonSong = result.data!!.getStringExtra("jsonSong")!!
    Log.d("jsonSong","$jsonSong") 
    // jsonSong: {"currentTime":128872,"isPlaying":false,"musicFile":"lilac","singer":"아이유(IU)","title":"LILAC","totalTime":216000}

    song = gson.fromJson(jsonSong, Song::class.java)
    Log.d("song객체", "$song")  
    // Song(title=LILAC, singer=아이유(IU), totalTime=216000, currentTime=128872, isPlaying=false, musicFile=lilac)
  }
}

 

MainActivity 에서 registerForActivityResult 를 통해 반환받은 값을 LogCat을 통해 확인 해 보았다.

 

String 값을 보냈으므로 getStringExtra 를 통해 String 값을 jsonSong 변수에 담아주었다.

 

그 이후, gson.fromJson(jsonSong, Song::class.java)  코드를 통해 JSON 형태의 String 값을 Song 객체 형태로 변환해서 지정해준다.

 

 

 

추가적으로 나중에 JSON 타입의 데이터를 파싱하는 경우가 많은데,

  • JSON 타입의 문자열 데이터라면 JSONObject() 를 통해,
  • JSON 타입의 배열 데이터라면 JSONArray() 를 통해 파싱한다.

나중에 필요하면 추가적인 포스팅을 하도록 하겠다.