assaulter's diary

最近はバイクブログと化している...

case classを用いて任意のJSONを返す

api的なものを実装する際、Jsonでデータをやり取りすることがあると思いますがその際のやり方の一つとして。

case classの説明については

などを参考にしてみてください。

今回は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のドキュメントに書いてあるんですけどね!