Подтвердить что ты не робот

Как отобразить ответ JSON в Play Framework v2.0 (последняя сборка из GIT)

Я пытаюсь сделать какой-то ответ вроде этого

def doAjax = Action { request =>
    object MyResult {
        val resultCode = 0
        val resultTextMessage = "sss" 
    }
    Ok(Json(MyResult)) // It 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 working in 1.0
}    
4b9b3361

Ответ 1

EDIT2

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

ИЗМЕНИТЬ

Мы все будем рады прочитать новую запись Wiki для этого момента. Проверьте этот вне


Назад

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

Они переходят из Джексона в философию, вдохновленную SJSON, которая предлагает больше контроля над un/marshalling, которая позволяет управлять объектами их, без накладных расходов 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).

Ответ 2

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

Ответ 3

Я нашел это решение в тестах интеграции с играми прямо сейчас.

Требуется определить в 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")))
    }
}

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

Ответ 4

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

  def demo = Action {

    ....


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

  }