私はこのようないくつかの応答をレンダリングしようとしています
def doAjax = Action { request =>
object MyResult {
val resultCode = 0
val resultTextMessage = "sss"
}
Ok(Json(MyResult)) // It's not working anymore - not compiling in v2.0!
}
しかし、Play 2.0でオブジェクト(MyResult)をJSONにマップする方法は? scalaモジュールを使用したPlay 1.0では、次の操作を正常に実行しました。
def dosomeaj = {
object MyResult{
val resultCode = 0
val resultTextMessage = "sss"
}
Json(MyResult) // It's working in 1.0
}
新しい Wikiリンク for v2.1。以下の古いリンクはもう機能していません。
この点については、新しいWikiエントリを読んで喜んでいます。チェック これ アウト
これは、play 2.0でのJsonサポートの状態に関するコミュニティからのコメントです。 投稿へのリンク
彼らはジャクソンから [〜#〜] sjson [〜#〜] に触発された哲学へと移行しています。リフレクションの(私はそれらに同意しますが、パフォーマンスの苦痛であり、クラスの変更に対して脆弱です...)
だからここにあなたが投稿で読むことができるものがあります:
case class Blah(blah: String)
// if you want to directly serialize/deserialize, you need to write yourself a formatter right now
implicit object BlahFormat extends Format[Blah] {
def reads(json: JsValue): Blah = Blah((json \ "blah").as[String])
def writes(p: Blah): JsValue = JsObject(List("blah" -> JsString(p.blah)))
}
def act = Action { implicit request =>
// to get a Blah object from request content
val blah = Json.parse(request.body.asText.get).as[Blah]
// to return Blah as application/json, you just have to convert your Blah to a JsValue and give it to Ok()
Ok(toJson(blah))
}
2番目のリンク( [〜#〜] sjson [〜#〜] )では、case class
とその分解メソッド(unapply
)。
Play 2にはジャークソンが付属しています
case class Blah(blah: String)
import com.codahale.jerksHon.Json._
def act = Action { implicit request =>
Ok(generate(parse[Blah](request.body.asText.get))).as("application/json")
}
このコードは、jsonを逆シリアル化および再シリアル化します。
現在、このソリューションをPlay統合テストで見つけました。
App/models/MyResult2.scalaで次のコンテンツを定義する必要があります。
case class MyResult2(resultCode: Int, resultTextMessage: String)
object Protocol {
implicit object MyResult2Format extends Format[MyResult2] {
def writes(o: MyResult2): JsValue = JsObject(
List("resultCode" -> JsNumber(o.resultCode),
"resultTextMessage" -> JsString(o.resultTextMessage)
)
)
def reads(json: JsValue): MyResult2 = MyResult2(
(json \ "resultCode").as[Int],
(json \ "resultTextMessage").as[String]
)
}
}
この後、次のようにコントローラークラスで使用できます。
import play.api._
import play.api.mvc._
import play.api.libs.json._
import models._
import models.Protocol._
object Application extends Controller {
def doAjax = Action { request =>
Ok(toJson(MyResult2(0, "Ney")))
}
}
手動の静的マーシャリングコードが必要になりました。
「play.api.mvc.as」を使用できます
def demo = Action {
....
Ok(jsonString).as("text/json")
}