遇到此错误时,正在关注Play Frameworks的Scala Json api文档:
值read不是play.api.libs.json.JsValue的成员
我的进口是:
import play.api.libs.json._ // JSON library
import play.api.libs.json.Reads._ //custom validation helpers
import play.api.libs.functional.syntax._ // Combinator syntax
和方法抛出错误是:
def callSearchRoleRowInRoleService = Action(parse.json) {
implicit request =>
var rolejson = request.body
val roleId = (rolejson \ "roleId").read[Int]
val shortDescription : Reads[String]= (rolejson \ "shortDescription").read[String]
val description = (rolejson \ "description").read[String]
val activationDate = (rolejson \ "activationDate").read[java.sql.Date]
val deactivationDate = (rolejson \ "deactivationDate").read[java.sql.Date]
}
在没有读取方法的情况下完美地工作
答案 0 :(得分:2)
您确实应该将数据反序列化为案例类。 read[A]
是JsPath
上的一种方法,用于创建Reads[A]
以组合成更大的Reads
对象。正如@drexin所提到的,你可能正在寻找as[A]
,但这不是一个安全的操作。如果单个as
失败,则会抛出异常,在您的控制器逻辑中会导致内部服务器错误而几乎没有信息可以帮助用户。
您可以为这样的案例类构建Reads
:
case class Role(id: Int, short: String, description: String, activation: java.sql.Date, deactivation: java.sql.Date)
object Role {
implicit val reads: Reads[Role] = (
(JsPath \ "roleId").read[Int] and
(JsPath \ "shortDescription").read[String] and
(JsPath \ "description").read[String] and
(JsPath \ "activationDate").read[java.sql.Date] and
(JsPath \ "deactivationDate").read[java.sql.Date]
)(Role.apply _)
}
然后您的控制器功能看起来更像这样:
def callSearchRoleRowInRoleService = Action(parse.json) { implicit request =>
request.body.validate[Role].fold(
errors => { // handle validation errors, return some error message? },
role => { // do something with the `role` to product a `Result` }
)
}
使用validate
的好处是可以累积所有验证错误,因此可以一次处理所有错误,而不会抛出异常。
因为其他人只是绑定来提及它,对于简单的案例类(如上面的那个),你可以跳过组合器并使用宏:
implicit val reads = Json.reads[Role]
答案 1 :(得分:1)
如果您使用组合器创建read[A]
,则只需使用Reads[A]
。您要查找的方法是as[A]
。