通过阅读article,我无法弄清楚如何将Some(JsValue)
转换为字符串。
示例:
val maybeString: Option[JsValue] = getSomeJsValue(); // returns Some(JsValue)
val str: String = maybeString match {
case Some(x) => x.as[String]
case _ => "0"
}
运行时错误:
play.api.Application$$anon$1: Execution exception[[JsResultException: JsResultException(errors:List((,List(ValidationErr
or(validate.error.expected.jsstring,WrappedArray())))))]]
at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.3]
答案 0 :(得分:6)
你想要组成多个选项,这就是flatMap的用途:
maybeString flatMap { json =>
json.asOpt[String] map { str =>
// do something with it
str
}
} getOrElse "0"
或者作为理解:
(for {
json <- maybeString
str <- json.asOpt[String]
} yield str).getOrElse("0")
我还建议使用地图中的值并传递Option,因此控件将处理None并将其映射到BadRequest
。
答案 1 :(得分:3)
您的错误来自于您未对x的类型施加足够的条件:maybeString
是Option[JsValue]
,而不是Option[JsString]
。在maybeString
不是Option[JsString]
的情况下,转化失败并引发异常。
你可以这样做:
val str: String = maybeString match {
case Some(x:JsString) => x.as[String]
case _ => "0"
}
或者您可以使用asOpt[T]
代替as[T]
,如果转化成功,则会返回Some(_.as[String])
,否则会None
。