Kotlin
JSON
初心者
Jackson

かんたん!KotlinでJSONパース【Jackson】

かんたん!KotlinでJSONパース【Jackson】

Kotlinのお勉強がてらJSONパーサー(deserialize)を作成したのですが、
あまりにも記述が簡潔だったのでご紹介します!

Jackson Kotlin Module

JavaのJSONパースライブラリとしてはJacksonがおなじみですね。
そのJacksonの開発元のFasterXMLからKotlin用に"Jackson Kotlin Module"が提供されています。
今回はこちらを用いてJSONをオブジェクトへとパースします。

環境

  • Kotlin: 1.1.51
  • Jackson Kotlin Module: 2.9.0

準備

まずはJackson Kotlin Moduleをダウンロードします。

Mavenの場合は以下をpom.xmlへ追加

pom.xml
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.9.0</version>
</dependency>

Gradleの場合は以下を追加

build.gradle
compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.0"

パースするJSON

今回パースするJSONはこちら。

color.json
{
  "color": "green",
  "kana": "みどり",
  "code": {
    "rgba": [0,255,0,1],
    "hex": "#0F0"
  }
}

{}が入れ子になっていて少し厄介なJSONです。
それではコードを書いていきましょう。

その1: dataクラスを作成

KotlinでJSONパースをするにあたってまずはdataクラスを作りましょう。
この記事においてdataクラスの詳しい説明は避けますが、
ざっくりいうとclassの定義にdataという修飾子を付けることで、
hashCodeやequals, toStringなどプロパティ関連の各種メソッドを自動で作ってくれます。
すごく便利ですね!

それではパースするJSONに合わせて以下のようにdataクラスを作ります。

Color.kt
data class Color(val color: String, val kana: String, val code: Code)

たった1行です。
Color.ktの各プロパティはcolor.jsonの3つのキー("color", "kana", "code")と対応しています。
またキー:"code"の箇所は{}が入れ子になっているため、Code型のプロパティを作成し、dataクラス(Code.kt)を同様に作成します。

Code.kt
data class Code(val rgba: IntArray, val hex: String)

こちらも同じく1行です。
以上でパースしたJSONを格納するオブジェクトの準備はできました。

その2: パース

あとはパース(deserialize)をする処理を書くだけです。

Main.kt
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

fun main(args: Array<String>) {
    // パースするJSON
    val json = "{ \"color\": \"green\", \"kana\": \"みどり\", \"code\": { \"rgba\": [0,255,0,1], \"hex\": \"#0F0\" } }"

    // mapperオブジェクトを作成
    val mapper = jacksonObjectMapper()

    // jsonをdeserialize
    // 下の場合はjsonがColor型のオブジェクトにマッピングされる
    val color = mapper.readValue<Color>(json)

    println(color)
    println("色(かな):${color.kana}")
    println("RGBAコードのG値:${color.code.rgba[1]}")
}

jackson-kotlin-modukeのjacksonObjectMapper()でマッパーを作成し、
あとはreadValue()でパースしたいjsonを渡すだけです。
実行結果は以下のようになります。

Color(color=green, kana=みどり, code=Code(rgba=[0, 255, 0, 1], hex=#0F0))
色(かな):みどり
RGBAコードのG値:255

以上の通り、簡潔な記述によりJSONとして渡した内容をオブジェクトに変換することができました。

さいごに

私はKotlinをはじめて1周間程度なのですが、簡潔な記述できる工夫を節々に感じ、すっかりKotlinが好きになりました。
特にJavaのLombokを使っているかのようにアクセッサメソッドをかかずに済むところは非常に便利ですね。
またJavaの膨大なライブラリの恩恵を受けることができるのもKotlinのいいところですね。

ソースコードはGitHubにも置きました。こちら

本記事へのご指摘やアドバイスがございましたら、ぜひ教えて頂けるとうれしいです!