Dav*_*Lee 5 json scala playframework playframework-2.0
我正在尝试使用JSON请求将数据从客户端发送到服务器.JSON请求的主体如下所示:
{
"upload":
{
"ok":"some message",
"assemblyId":"a9d8f72q3hrq982hf98q3"
}
}
Run Code Online (Sandbox Code Playgroud)
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")
}
}
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么上面的代码失败了.该方法将请求主体映射到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])
}
Run Code Online (Sandbox Code Playgroud)
您可以在https://github.com/playframework/Play20/blob/2.0.x/framework/src/play/src/main/scala/play/api/libs/json/Reads中了解如何实现 Reads 实例 .scala#L35
| 归档时间: |
|
| 查看次数: |
4322 次 |
| 最近记录: |