11

通读这篇文章,我不知道如何将我的转换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]
4

2 回答 2

7

您想组合多个选项,这就是 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")

我还建议使用地图中的值并传递选项,因此 None 将由您的控制器处理并映射到BadRequest例如。

于 2013-08-30T13:49:17.590 回答
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

于 2013-08-29T20:14:20.610 回答