如何在Play项目中解析JSON请求

skb*_*skb 1 json scala playframework

我正在使用Scala + Play构建一个简单的Web服务器.我无法弄清楚如何接受JSON请求并将其反序列化为我预定义类型的对象.我需要帮助1)下载一个支持良好的JSON包,2)在我的代码中导入包来解析HTTP请求,3)实际解析一些JSON.

以下是我在#1的SBT文件中输入的内容:

libraryDependencies += "org.json4s" %% "json4s-native" % "3.2.9"
Run Code Online (Sandbox Code Playgroud)

以下是我为#2导入它的方法:

import org.json4s._
import org.json4s.native.JsonMethods._
Run Code Online (Sandbox Code Playgroud)

这是我尝试在我的操作中解析一些JSON的地方:

package controllers

import play.api._
import play.api.mvc._
import play.api.libs.json.Json
import org.json4s._
import org.json4s.native.JsonMethods._

object Application extends Controller {
  case class Credentials(username: String, password: String)

  def login = Action { request =>
      Ok(Json.obj("message" -> "You tried to log in as: " + parse(request.body).extract[Credentials].username))
  }
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?我在运行时遇到错误,说:"play.PlayExceptions $ CompilationException:编译错误[controllers.Application.parse.type不接受参数]"

Mic*_*jac 5

你正遭受命名空间污染.您的Application控制器parseplay.api.mvc.Controller特征继承对象,并在命名空间中import org.json4s.native.JsonMethods._包含它自己的对象parse.我很惊讶这甚至编译.使其更明确将有效.从导入中删除通配符,并显式调用JsonMethods.parse.

正如这些意见所暗示的那样,这一切都是不必要的.Play内置的json库工作得很好,所以我建议你阅读它们并使用它们.还有很多与Play JSON相关的其他SO帖子.

  • `implicit val jsonFormat:Format [Credentials] = Json.format [Credentials]`是用于定义案例类的读/写的最小样板.Play还会汇总验证错误,并允许您根据需要使验证规则更复杂. (2认同)