![](/img/trans.png)
[英]handling json requests and responses in scala play framework and send to angular js java script
[英]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.