［Kotlin］ JSON To Kotlin Classを使ってJSONからデータクラスを生成する

# はじめに

JSON To Kotlin ClassはAndroid Studio、IntelliJ IDEAで動作するプラグインです。
このプラグインを使うとJSONからデータクラスを簡単に生成することができます。

# JSON To Kotlin Classをインストールする

今回はIntelliJ IDEAで動作を確認していこうと思います。
次の手順でJSON To Kotlin Classをインストールします。

1. 「IntelliJ Idea」を起動する
2. 「IntelliJ Idea」->「Preferences」->「Plugins」を開く。
3. 「Marketplace」->「Json To Kotlin Class」と入力する。
4. 「JSON To Kotlin Class (JsonToClass)」の「Install」を選択する。
5. 「Restart　IDE」を選択し「IntelliJ Idea」を再起動する。

# JSONの文字列からクラスを生成する

JSON To Kotlin Classを利用すれば、
次の手順でJSON文字列からデータクラスを生成することができます。

1. 「Project」->「src」を右クリックし、「New」->「Kotlin data class File from Json」を選択する。
2. 「Genrate Kotlin Data Class Code」にJSONファイルを貼り付ける。
3. 「Class Name」に名称を入力する。
4. 　全ての入力が完了したら「Generate」を選択する。

次のような感じで今回はGitHub APIの[GET /repos/:owner/:repo/contributors](https://developer.github.com/v3/repos/#list-contributors)にて
取得できる次のJSONを貼りつけてみました、そのため"Class Name"はContributorとしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/eac83b16-6468-ce92-b5b5-4c74ea1bd4f7.png" height=500>

Generateを選択した後、自動的に次のようなデータクラスが生成されます。
はい上手くデータクラスが出力されていますね。

```kotlin:Contributor.kt
data class Contributor(
    val avatar_url: String,
    val contributions: Int,
    val events_url: String,
    val followers_url: String,
    val following_url: String,
    val gists_url: String,
    val gravatar_id: String,
    val html_url: String,
    val id: Int,
    val login: String,
    val node_id: String,
    val organizations_url: String,
    val received_events_url: String,
    val repos_url: String,
    val site_admin: Boolean,
    val starred_url: String,
    val subscriptions_url: String,
    val type: String,
    val url: String
)
```

# データクラスを生成する際のルールを設定する

JSON To Kotlin Classではデータクラスを生成する際のルールを設定できます。
次の手順で設定画面は開くことができます。

1. 「Project」->「src」を右クリックし、「New」->「Kotlin data class File from Json」を選択する。
2. 「Genrate Kotlin Data Class Code」 の「Advanced」を選択する。

次のような感じで大きく分けてProperty,Annotation,Other,Extensionsの設定があるようです。
まぁ主に使うのはPropertyのところにはなるとは思います。

| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/fa3219e6-4df0-6fe4-234b-89a9694cedfb.png" height=150> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/f9332418-adee-a9ac-f8b9-15e5671429d5.png" height=150> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/3be56b1d-d2b4-4b02-7bc5-d29f33047c6c.png" height=150> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/0cab4cd6-b6d2-de4e-7236-f2933721ceb2.png" height=150>|
| --- | --- | --- | --- |

例えば「Property」->「Keyword」を「Var」に変更すると、
次のようにプロパティがVarで宣言されたデータクラスが生成されます。

```kotlin:Contributor.kt(Var)
data class Contributor(
    var avatar_url: String,
    var contributions: Int,
    var events_url: String,
    var followers_url: String,
    var following_url: String,
    var gists_url: String,
    var gravatar_id: String,
    var html_url: String,
    var id: Int,
    var login: String,
    var node_id: String,
    var organizations_url: String,
    var received_events_url: String,
    var repos_url: String,
    var site_admin: Boolean,
    var starred_url: String,
    var subscriptions_url: String,
    var type: String,
    var url: String
)
```

また「Property」->「Type」を「Nullable」に変更すると、
次のようにプロパティがNULLを許容できるようにデータクラスが生成されます。

```Kotlin:Contributor.kt(Nullable)
data class Contributor(
    val avatar_url: String?,
    val contributions: Int?,
    val events_url: String?,
    val followers_url: String?,
    val following_url: String?,
    val gists_url: String?,
    val gravatar_id: String?,
    val html_url: String?,
    val id: Int?,
    val login: String?,
    val node_id: String?,
    val organizations_url: String?,
    val received_events_url: String?,
    val repos_url: String?,
    val site_admin: Boolean?,
    val starred_url: String?,
    val subscriptions_url: String?,
    val type: String?,
    val url: String?

```

また「Property」->「Default Value Strategy」を「Init With Non-Null Default Value(Avoid Null)」に
変更すると次のように初期化値をNULL以外に初期化してくれるデータクラスを生成できます。

```Kotlin:Contriburt.kt(InitWithNonNullDefaultValue(AvoidNull)
data class Contributor(
    val avatar_url: String = "",
    val contributions: Int = 0,
    val events_url: String = "",
    val followers_url: String = "",
    val following_url: String = "",
    val gists_url: String = "",
    val gravatar_id: String = "",
    val html_url: String = "",
    val id: Int = 0,
    val login: String = "",
    val node_id: String = "",
    val organizations_url: String = "",
    val received_events_url: String = "",
    val repos_url: String = "",
    val site_admin: Boolean = false,
    val starred_url: String = "",
    val subscriptions_url: String = "",
    val type: String = "",
    val url: String = ""
)
```

こんな感じである程度はデータクラスを生成するときのルールを設定できるようです。

# おわりに

* JSONからデータクラスを生成するにはJSON To Kotlin Class プラグインが使える
* JSONを貼ってGenerateするだけでデータクラスが生成できる
* JSONからデータクラスを生成するときのルールを設定できる

# 参考

| タイトル | 簡単な説明 |
| :------- | :-------- |
| [JsonToKotlinClass - GitHub](https://github.com/wuseal/JsonToKotlinClass) | GitHubにオプション設定の詳細が記載されているので、詳しい設定がしたい場合はここを閲覧する。 |
| [JsonToKotlinClass(JsonToKotlinClass) Plugins - JetBrains](https://plugins.jetbrains.com/plugin/9960-json-to-kotlin-class-jsontokotlinclass-/) | プラグインの説明ページです。 |