我正试图像这样做出一些回应
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
}
答案 0 :(得分:13)
v2.1的新Wiki link。以下旧链接不再有效。
对于这一点,我们都很乐意阅读新的Wiki条目。检查this
以下是社区对Play 2.0中Json支持状态的评论。 link to Post
他们正在从杰克逊转向受SJSON启发的哲学,这种哲学提供了对编组的更多控制,带来了管理它们的设施,没有反射的开销(我同意它们是一个对于表现的痛苦和对班级变化的脆弱......)
以下是您在帖子上可以阅读的内容:
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
)特别注意可能的通用格式。
答案 1 :(得分: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。
答案 2 :(得分: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")))
}
}
现在需要一些手动静态编组代码。
答案 3 :(得分:0)
您可以使用' play.api.mvc.as'
def demo = Action {
....
Ok(jsonString).as("text/json")
}