【问题标题】:How to render JSON response in Play framework v2.0 (latest build from GIT)如何在 Play 框架 v2.0 中呈现 JSON 响应(来自 GIT 的最新版本)
【发布时间】:2012-01-01 20:30:09
【问题描述】:

我正在尝试呈现一些这样的响应

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
}    

【问题讨论】:

  • 我不确定这个问题是否有意义,因为“从 GIT 构建的最新版本”可能会随着时间而改变……
  • 这个关于 RC1 的问题来自 Git,它比 Beta 更稳定。无论如何,在 Beta 中没有任何 JSON 支持。
  • @Julien Richard-Foy...随着时间的推移,一切都在改变;-)

标签: json scala playframework-2.0


【解决方案1】:

编辑2

新的Wiki link 用于 v2.1。下面的旧链接已经失效了。

编辑

对于这一点,我们都很乐意阅读新的 Wiki 条目。签出this


以前的

以下是社区关于 play 2.0 中 Json 支持状态的评论。 link to Post

他们正在从 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)可能的通用格式。

【讨论】:

  • 我已经发布了另一个解决方案作为答案 - 也看看这个。
  • 我真的不知道为什么 Play2 现在需要显式手动映射到 JsValue。有时它可能很好,但对于像我的示例这样的简单响应映射无用:(
  • 是的,但实际上它只是遗漏了 Template.scala 源代码中的一小部分代码。无论如何,我将把这个问题与一个问题链接到群组groups.google.com/forum/#!topic/play-framework/VeVacV4CU1o
  • 谢谢安迪!我同意反射当然不利于性能,并且我理解为什么现在需要编写编组代码。我认为还有另一种方法可以在框架内动态编译/生成编组代码:) 无论如何它现在正在工作,谢谢!
  • @andypetrella,请在下面查看我的评论。我不认为 play 正在从 jackson/jerkson 转移到 SJSON,Pascal 只提到解析器受到它的启发,并且解析器应该是处理 JSON 的首选方式,但是,在某些情况下,可能需要退回到 Jerkson这应该是一个选择
【解决方案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

【讨论】:

  • 谢谢伊万!但是,如果您查看上面的答案,他们正在从 Jerkson 迁移到 SJSON。但是您的解决方法比“官方”要小:)
  • @admob,我认为您误解了 Pascal 的评论。 Play 的解析器仅受 SJSON(或 liftJSON)启发。在它下面使用 jerkson/jackson,我不知道有任何改变它的计划。因此,虽然处理 JSON 的首选方式始终是通过提供的解析器和 toJson(..),但如果需要,总是可以使用 Jerkson Ok(com.codahale.jerksHon.Json.generate(Map("1"-> "2")).as("应用程序/json")
  • 谢谢你,poko!现在我明白了。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你可以使用'play.api.mvc.as'

      def demo = Action {
    
        ....
    
    
        Ok(jsonString).as("text/json")
    
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-19
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多