Как отобразить JSON-ответ в Play Framework v2.0 (последняя сборка из GIT) - PullRequest
18 голосов
/ 02 января 2012

Я пытаюсь отобразить какой-нибудь ответ, подобный этому

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

, но как сопоставить мой объект (MyResult) с JSON в Play 2.0?В Play 1.0 с модулем scala я успешно выполнил следующее:

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

Ответы [ 4 ]

14 голосов
/ 02 января 2012

EDIT2

Новая Вики-ссылка для v2.1. Старая ссылка ниже не работает.

EDIT

Мы все будем рады прочитать новую запись в Вики по этому вопросу. Проверьте это из


Назад

Вот комментарий сообщества о состоянии поддержки Json в игре 2.0. ссылка на сообщение

Они переходят от Джексона к философии, вдохновленной SJSON , которая предлагает больший контроль над распаковыванием / упорядочением, который предоставляет возможности для управления ими, без накладных расходов на Reflection (что я с ними согласен) это боль в производительности и хрупкость по отношению к изменениям класса ...)

Итак, вот что вы можете прочитать на посту:

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

Во второй ссылке ( SJSON ) я предлагаю вам обратить особое внимание на общее форматирование, возможное с помощью case class и их метода деконструкции (unapply).

6 голосов
/ 02 января 2012

Play 2 поставляется с 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")
}

Этот код десериализует и повторно сериализует JSON.

Для получения дополнительной информации https://github.com/codahale/jerkson

5 голосов
/ 02 января 2012

Я нашел это решение в интеграционных тестах 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")))
    }
}

Теперь требуется некоторый код статического ручного маршалинга.

0 голосов
/ 10 ноября 2014

Вы можете использовать 'play.api.mvc.as'

  def demo = Action {

    ....


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

  }
...