Kotlin を触ってもうすぐ 3 週間が経過します。
Spring Boot との兼ね合いもあるけど何か新しいことをするたびにハマりますね・・・。
今回はクラスオブジェクトを JSON に変換する方法を紹介したいと思います。
ライブラリ別の使用方法
JSON への変換だったら、PHP なら json_encode() 一発じゃんって思っちゃうのですが、Kotlin や Java ではそうはいきません。
シェルだって jq コマンドを利用すればサクサクっとパースできなくもないですよね。
しかし、Kotlin の場合はライブラリを利用しないといけない。
そして、ライブラリの候補ラインナップも当然のように複数登場します。
GSON
まずは、根強い人気を誇ってきた Google の GSON。
利用者が多い分、情報も豊富にありパフォーマンス面でも悪くないと言われています。
残念ながら使ったことはないので特にコメントすることはありません。
gson インスタンスの toJson() と fromJson() でシリアライズとデシリアライズが可能。
1 2 3 | // Hogeクラスを想定するとこんなイメージ val hoge = Gson().fromJson("JSON文字列", Hoge) val json = Gson().toJson(hoge) |
Moshi(Kotshi)
Java の JSON 変換ライブラリを Kotlin 拡張した Kotshi がこれからのトレンドになりそうな気配。
特に Android 界隈では利用者が多いようです。
data class に @JsonSerializable のアノテーションを定義して、そこからさらに・・・。
う~ん、ちまちまとクラスファイルを増やしたくないです。
Jackson
たまたま build.gradle に以下の定義があったので、もう Jackson でいいやという感じで採用。
1 | com.fasterxml.jackson.module:jackson-module-kotlin |
詳しい説明は GitHub(kotlinの方)を見てもらうのがいいかと思います。
わざわざマッパーオブジェクトを作らないといけないので一手間ありますが、使い方はシンプルです。
今回は JSON の文字列が欲しかったので、data class を単純に変換します。
1 2 3 4 5 | import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper hoge: Hoge = Hoge() val json: String = jacksonObjectMapper().writeValueAsString(hoge) |
data class 側で null の値を除外する場合は、以下のアノテーションを定義します。
1 | @JsonInclude(JsonInclude.Include.NON_NULL) |
ちょいちょい端折っているのでこのままだと動かないですが、イメージとしてはこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty val hoge: Hoge = Hoge("id", null) val json: String = jacksonObjectMapper().writeValueAsString(hoge) @JsonInclude(JsonInclude.Include.NON_NULL) data class Hoge( @JsonProperty("ID") val id: String, @JsonProperty("NAME") val name: String ) |
逆に、JSON 文字列を特定の Class オブジェクトに変換したい場合は jacksonObjectMapper().readValue を使うといいですね。
jacksonObjectMapper().readValue(json, T::class.java)
まとめ
JSON の変換ライブラリは自分の好みのものや、携わるプロジェクトに沿って選定すればいいと思います。
PHP が好きだった身としては面倒に感じることしかないですが、このあたりは慣れるしかないですね。
特にアノテーションのクラスをわざわざ作る手法はあまり好みではありません。
Spring Boot の相関バリデーション作るのも手間だったし時間が無駄にかかる。
といった愚痴は時間が解決してくれることを期待します。