web-dev-qa-db-fra.com

Comment rendre la réponse JSON dans Play Framework v2.0 (dernière version de GIT)

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
}    
18
abdolence

EDIT2

Nouveau Lien Wiki for v2.1. L'ancien lien ci-dessous ne fonctionne plus.

MODIFIER

Nous serons tous heureux de lire la nouvelle entrée du wiki sur ce point. Vérifiez this out


PRÉCÉDENT

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).

13
andy petrella

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

6
Ivan Meredith

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.

5
abdolence

Vous pouvez utiliser le 'play.api.mvc.as'

  def demo = Action {

    ....


    Ok(jsonString).as("text/json")

  }
0
HasanAboShally