将JsValue转换为字符串

问题描述 投票:9回答:2

阅读此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]
json scala playframework-2.0
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")

我也建议您使用地图内的值并传递Option,因此,控制器将处理None并将其映射到BadRequest


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

© www.soinside.com 2019 - 2024. All rights reserved.