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 ください。