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.writesやJson.readsの代わりにJson.formatでFormatを定義することでWritesとReadsを同時に定義することができます。同じケースクラスを読み込みと書き出しの両方に使う場合はJson.formatを使うとよいでしょう
コントローラ
JsonControllerのlistメソッドを以下のように実装します。
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"}]}