IntentのputExtraにはオブジェクトを渡せないので、さてどうしたものかと思っていたのですが、
GSONを使ってJSON文字列に変換すれば、ただの文字列なので簡単に受け渡しをすることができました!
Dependencies
- Kotlin
- 今回はKotlinを使っていますが、Javaでも同様のことが可能です。
- GSON
- ようは文字列にシリアライズ/デシリアライズができればいいのでGSONじゃなくてもいいです。
オブジェクトのJSON文字列化
まずはオブジェクトです。データは単純にして、以下のようなものを使うことにします。
data class Person(val name: String,
val age: Int,
val height: Int)
data class Team(val name: String,
val member: List<Person>)
で、例えば以下のようにオブジェクトを生成してあげて、Gson().toJson()
で文字列変換してみます。
private fun createObjectForTest(): String {
// これは普通にKotlinのオブジェクトを生成してる
val team = Team("サッカー部", listOf(
Person("田中", 15, 179),
Person("太田", 16, 169),
Person("斎藤", 17, 180)
))
// ここでオブジェクトを文字列に変換して返却してる
return Gson().toJson(team)
}
Gsonを使うと超簡単にJSON文字列に変換できますね。
で、文字列のほうは以下のようにちゃんとJSON文字列に変換されてます。
// printlnで表示されたものをこぴっぺ
{"member":[{"age":15,"height":179,"name":"田中"},{"age":16,"height":169,"name":"太田"},{"age":17,"height":180,"name":"斎藤"}],"name":"サッカー部"}
整形するとこんな感じでいい感じ。
{
"member":[
{
"age":15,
"height":179,
"name":"田中"
},
{
"age":16,
"height":169,
"name":"太田"
},
{
"age":17,
"height":180,
"name":"斎藤"
}
],
"name":"サッカー部"
}
putExtraで渡す
JSON文字列の変換方法はわかったので実際にIntentで渡してみます。
MainActivity
に適当なボタンを配置してonClick関数を定義してセットします。
// テスト用のオブジェクトを生成して返却します
private fun createObjectForTest(): Team {
return Team("サッカー部", listOf(
Person("田中", 15, 179),
Person("太田", 16, 169),
Person("斎藤", 17, 180)
))
}
fun onClickNextBtn(V: View) {
val team: Team = this.createObjectForTest()
val intent = Intent(this, SubActivity::class.java)
// Gsonを使って文字列変換したものをセット
intent.putExtra("key_team", Gson().toJson(team))
startActivity(intent)
}
以上で、オブジェクトをIntentに乗せることができました。
あとは受け取り側で、"key_team"を指定して受け取ればいいですね。
受け取り側でJSON文字列をデシリアライズする
受け取り側はキーで値を取得できますが、もちろんStringなのでデシリアライズが必要です。
以下のように受け取った後に、Gson().fromJson<>()
を使ってあげれば一発でもとに戻せます。
// ここはJSON文字列
val json = intent.extras.getString("key_team")
// 型を指定して文字列からデシリアライズする
val team = Gson().fromJson<Team>(json, Team::class.java)
まとめ
JSONは文字列なので、GSONを使って変換すれば、ほかにも色々使いどころがありそうです。
例えば、プリファレンスへの保存にも実はJSONが使えます。
皆さんも色々使ってみてください。