加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Play Framework 2.0 Scala中处理JSON请求

发布时间:2020-12-16 18:15:46 所属栏目:安全 来源:网络整理
导读:我正在尝试使用 JSON请求将数据从客户端发送到服务器. JSON请求的主体如下所示: {"upload": { "ok":"some message","assemblyId":"a9d8f72q3hrq982hf98q3" }} Play能够将请求主体识别为JSON但是当我尝试解析单个值,即“上传”对象时,Play会抱怨它无法找到指
我正在尝试使用 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])
}

您可以在以下位置了解如何实现Reads实例
https://github.com/playframework/Play20/blob/2.0.x/framework/src/play/src/main/scala/play/api/libs/json/Reads.scala#L35

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读