[英]value read is not a member of play.api.libs.json.JsValue
出现此错误时,正在关注Play Frameworks的Scala Json api文档:
读取的值不是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]
}
无需读取方法即可完美工作
您确实应该将数据反序列化为案例类。 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]
仅在使用组合器创建Reads[A]
才需要使用read[A]
Reads[A]
。 您正在寻找的方法是as[A]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.