繁体   English   中英

在Play Framework 2.0 Scala中处理JSON请求

[英]Handling JSON requests in Play Framework 2.0 Scala

我正在尝试使用JSON请求将数据从客户端发送到服务器。 JSON请求的主体如下所示:

{
"upload":
    {
    "ok":"some message",
    "assemblyId":"a9d8f72q3hrq982hf98q3"
    }
}

Play能够将请求正文识别为JSON,但是当我尝试解析单个值(即“上载”对象)时,Play抱怨找不到指定的参数。

Scala方法如下:

def add(course:Long) = withAccount { account => implicit request =>
  println()
  println(request.body)  // output: AnyContentAsJson({"upload":{"ok":"ASSEMBLY_COMP...

  request.body.asJson.map { json =>
    println()
    println(json)  // output: {"upload":{"ok":"ASSEMBLY_COMPLETED","assemb...

    (json \ "upload").asOpt[models.SomeClass].map { upload =>
      Ok("Got upload")
    }.getOrElse {
      BadRequest("Missing parameter [upload]")
    }
  }.getOrElse {
    BadRequest("Expecting Json data")
  }
}

我无法理解上述代码为何失败。 该方法毫不费力地将请求主体映射到json对象。 “ println(json)”命令可以打印出与Chrome显示给我的“请求有效负载”完全相同的内容。 但是,当我尝试获取根对象“上载”时,它失败了。 并且该方法返回错误的请求,抱怨缺少参数。

要执行asOpt [models.SomeClass],需要有一个Reads实例才能起作用。

这是一个例子

case class SomeClass(ok: String, assemblyId: String)
implicit object SomeClassReads extends Reads[SomeClass] {
  def reads(json: JsValue) = 
    SomeClass((json \ "ok").as[String], (json \ "assemblyId").as[String])
}

您可以在https://github.com/playframework/Play20/blob/2.0.x/framework/src/play/src/main/scala/play/api/libs/json/Reads中查看如何实现Reads实例.scala#L35

如果您使用2.1x播放,则Reads与2.0x有所不同,这可能是您的主要问题(如我)。

您可以在这里找到一个很好的解释。

只需这段代码即可正常工作:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Person(name: String, age: Int, lovesChocolate: Boolean)

implicit val personReads = Json.reads[Person]

看起来很棒,不是吗? 但是,您需要注意以下几点:

  • 隐式定义应该在控制器中。 当然,还有其他一些方法可以做到这一点。

  • 如果您的模型在模型类中(在上面的示例中在控制器中),则不应将您的对象命名为与类相同的名称。 在这种情况下,它不起作用:

     case class Person(name: String, age: Int, lovesChocolate: Boolean) object Person{....} //this won't work 

这种方式有很大的优势。 我强烈建议您查看博客。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM