USERSテーブルからIDの昇順に全件取得し、ユーザ一覧をJSONで返します。

Writesの定義

Play2のJSONサポートでは、ScalaオブジェクトをJSONに変換するにはWrites、JSONをScalaオブジェクトに変換するためにはReadsを定義する必要があります。

ここではUSERSテーブルを検索して取得したケースクラスのリストをJSONに変換して返却するので、USERSテーブルに対応するUsersRowクラスに対応するWritesを定義しておく必要があります。

object JsonController extends Controller {
  // UsersRowをJSONに変換するためのWritesを定義
  implicit val usersRowWrites = Json.writes[UsersRow]
  ...

POINT

  • Play2のJSONサポートは単純なケースクラスの変換だけでなく、より複雑な変換やバリデーションなどを行うこともできます
  • Json.writesJson.readsの代わりにJson.formatFormatを定義することでWritesReadsを同時に定義することができます。同じケースクラスを読み込みと書き出しの両方に使う場合はJson.formatを使うとよいでしょう

コントローラ

JsonControllerlistメソッドを以下のように実装します。

def list = DBAction { implicit rs =>
  // IDの昇順にすべてのユーザ情報を取得
  val users = Users.sortBy(t => t.id).list

  // ユーザの一覧をJSONで返す
  Ok(Json.obj("users" -> users))
}

Json.objメソッドでケースクラスからJSONへの変換が行われますが、このときにケースクラスに対応したWritesが定義されていないとコンパイルエラーになります。

実行

コマンドラインから以下のコマンドを実行してユーザ一覧がJSONで取得できることを確認してみましょう。

curl -XGET http://localhost:9000/json/list

結果として以下のようなJSONが表示されるはずです。

{"users":[{"id":1,"name":"Taro Yamada","companyId":1},{"id":2,"name":"Jiro Sato"}]}