web-dev-qa-db-de.com

Rendern von JSON-Antworten in Play Framework v2.0 (neueste Version von GIT)

Ich versuche, so eine Antwort zu geben

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!
}   

aber wie kann ich mein Objekt (MyResult) mit Play 2.0 zu JSON zuordnen? In Play 1.0 mit dem Scala-Modul habe ich Folgendes erfolgreich durchgeführt:

def dosomeaj = {
    object MyResult{
        val resultCode = 0
        val resultTextMessage = "sss" 
    }
    Json(MyResult) // It's working in 1.0
}    
18
abdolence

EDIT2

Neuer Wiki-Link für v2.1. Der alte Link unten funktioniert nicht mehr.

BEARBEITEN

Wir freuen uns alle, den neuen Wiki-Eintrag für diesen Punkt zu lesen. Überprüfen Sie dies aus


BISHERIGE

Hier ist der Kommentar der Community zum Stand der Json-Unterstützung in Spiel 2.0. Link zu Post

Sie bewegen sich von Jackson zu einer Philosophie, die von sjson _ inspiriert ist und die mehr Kontrolle über das Rangieren bietet, das die Möglichkeit bietet, sie zu verwalten, ohne den Aufwand von Reflection (was ich ihnen zustimme, ist ein Schmerz.) für Leistung und ist fragil gegen Klassenänderungen ...)

Hier ist das, was Sie im Post lesen können:

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

Im zweiten Link ( SJSON ) schlage ich vor, die generische Formatierung mit case class und ihrer Dekonstruktionsmethode (unapply) besonders zu beachten.

13
andy petrella

Play 2 kommt mit 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")
}

Dieser Code wird deserialisieren und den Json erneut reserialisieren.

Weitere Informationen https://github.com/codahale/jerkson

6
Ivan Meredith

Ich habe diese Lösung jetzt in den Play-Integrationstests gefunden.

Es ist notwendig, in app/models/MyResult2.scala mit diesem Inhalt zu definieren:

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]
        )
    }
}

Und danach können Sie es in Ihrer Controller-Klasse folgendermaßen verwenden:

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")))
    }
}

Es ist jetzt ein manueller statischer Marshalling-Code erforderlich.

5
abdolence

Sie können die 'play.api.mvc.as' verwenden.

  def demo = Action {

    ....


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

  }
0
HasanAboShally