将JsValue转换为String

时间:2013-08-29 19:57:27

标签: json scala playframework-2.0

通过阅读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]

2 个答案:

答案 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的类型施加足够的条件:maybeStringOption[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