case classを用いて任意のJSONを返す
api的なものを実装する際、Jsonでデータをやり取りすることがあると思いますがその際のやり方の一つとして。
case classの説明については
- scalaのパターンマッチ入門 - http://d.hatena.ne.jp/seratch2/20110429/1304090707
- scalaのcase class - http://d.hatena.ne.jp/xuwei/20101005/1286303814
などを参考にしてみてください。
今回はcase classのコンパニオンオブジェクトに、play.api.libs.json.Writesを使った変換用のプロトコルを定義してやれば、コントローラでtoJsonを叩くと・・・?というところをコードにしてみました。
case classおよびwritesを定義
package models import play.api.libs.json._ import play.api.libs.json.Writes case class Entry(id: String, title: String) object Entry { implicit object EntryWriter extends Writes[Entry] { override def writes(entry: Entry) = JsObject(List( "id" -> JsString(entry.id), "title" -> JsString(entry.title) )) } }
ControllerでJSONを返す
package controllers import play.api.mvc._ import models.Entry import play.api.libs.json._ import Json._ object Application extends Controller { def getEntry = Action { val entryList = List(Entry("id1", "title1"), Entry("id2", "title2")) Ok(toJson(Map("entries" -> entryList))) } }
実行結果
{"entries":[{"id":"id1","title":"title1"},{"id":"id2","title":"title2"}]}
まあPlayのドキュメントに書いてあるんですけどね!
- The Play JSON library with jenerics - http://www.playframework.org/documentation/2.0.1/ScalaJsonGenerics