18

我正在尝试做出这样的回应

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

但是如何使用 Play 2.0 将我的对象(MyResult)映射到 JSON?在使用 scala 模块的 Play 1.0 中,我成功地完成了以下操作:

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

4 回答 4

14

编辑2

v2.1 的新Wiki 链接。下面的旧链接不再有效。

编辑

对于这一点,我们都会很高兴阅读新的 Wiki 条目。看看这个_


以前的

这是社区关于 play 2.0 中 Json 支持状态的评论。 链接到帖子

他们正在从 Jackson 转向受SJSON启发的哲学,该哲学提供了对 un/marshalling 的更多控制,带来了管理它们的设施,没有反射的开销(我同意他们的观点是对性能的痛苦,并且对班级变化...)

因此,您可以在帖子中阅读以下内容:

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

于 2012-01-01T21:41:37.583 回答
6

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

于 2012-01-02T05:04:47.363 回答
5

我现在在 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")))
    }
}

现在需要一些手动静态编组代码。

于 2012-01-01T23:24:07.853 回答
0

您可以使用“play.api.mvc.as”

  def demo = Action {

    ....


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

  }
于 2014-11-10T11:55:21.270 回答