J'essaie de donner une réponse comme celle-ci
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!
}
mais comment mapper mon objet (MyResult) vers JSON avec Play 2.0? Dans Play 1.0 avec le module scala, j’ai réussi à:
def dosomeaj = {
object MyResult{
val resultCode = 0
val resultTextMessage = "sss"
}
Json(MyResult) // It's working in 1.0
}
Nouveau Lien Wiki for v2.1. L'ancien lien ci-dessous ne fonctionne plus.
Nous serons tous heureux de lire la nouvelle entrée du wiki sur ce point. Vérifiez this out
Voici le commentaire de la communauté sur l’état de la prise en charge de Json dans le jeu 2.0. link to Post
Ils passent de Jackson à une philosophie inspirée par SJSON qui offre plus de contrôle sur l’un/marshalling, qui offre des facilités pour les gérer, sans la surcharge de Reflection (que je partage avec eux. une douleur pour la performance et est fragile contre les changements de classe ...)
Alors, voici ce que vous pouvez lire sur le post:
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))
}
Dans le deuxième lien ( SJSON ), je vous propose de porter une attention particulière au formatage générique possible en utilisant case class
et leur méthode de déconstruction (unapply
).
Play 2 vient avec Jerkson
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")
}
Ce code désérialisera et resérialisera le JSON.
Pour plus d'informations https://github.com/codahale/jerkson
J'ai trouvé cette solution dans les tests d'intégration Play en ce moment.
Il est nécessaire de définir dans app/models/MyResult2.scala avec ce contenu:
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]
)
}
}
Et après cela, vous pouvez l’utiliser dans votre classe de contrôleur comme ceci:
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")))
}
}
Il faut maintenant du code de marshalling statique manuel.
Vous pouvez utiliser le 'play.api.mvc.as'
def demo = Action {
....
Ok(jsonString).as("text/json")
}