play-json で snake_case な json を camelCase な case class にマッピングする
play-json を使えば json を case class にマッピングすることは簡単にできますが、json のキーがそのまま case class のフィールドに対応するため、snake_case な json API を case class にマッピングするためには、case class のフィールドも snake_case にする必要があります。Scala は camelCase にするのが主流ですから少し気持ち悪いですね。
snake_case な json を camelCase な case class にマッピングするためには、いつも使っている Json.format[T] のラッパーを作る必要があります。作りました。
tototoshi/play-json-naming · GitHub
build.sbt に
libraryDependencies += "com.github.tototoshi" %% "play-json-naming" % "0.1.0"
して使ってください。
使い方は、JsonNaming.snakecase を呼び出すだけの単機能ライブラリです。
import com.github.tototoshi.play.json.JsonNaming case class Name(firstName: String, lastName: String) case class User(id: Int, nameData: Name) // Json.format[T] をラップする implicit val nameFormat = JsonNaming.snakecase(Json.format[Name]) implicit val userFormat = JsonNaming.snakecase(Json.format[User]) val jsonString = """{"id":1,"name_data":{"first_name":"Toshiyuki","last_name":"Takahashi"}}""" Json.parse(jsonString).validate[User] Json.toJson(User(1, Name("Toshiyuki", "Takahashi")))
イメージとしては
+---------------+
| json string |
+---------------+
⇅
+---------------+
| JsValue |
+---------------+
⇅ JsonNaming.snakecase
+---------------+
| JsValue |
+---------------+
⇅
+---------------+
| case class |
+---------------+
こんなかんじで、json の内部表現である JsValue に対して変換をかけています。
snake_case 以外にもよくある規則があれば取り込みますので pull-req ください。