【问题标题】:Converting JsValue to String将 JsValue 转换为字符串
【发布时间】:2013-09-02 09:59:24
【问题描述】:

通读这个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]

【问题讨论】:

  • 如果你确定有一个JsString:maybeString.map(_.toString)

标签: json scala playframework-2.0


【解决方案1】:

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

【讨论】:

  • 好的 - 你的第一个实施对我来说是成功的。我改用asOpt[Long],因为asOpt[String] 不匹配,即返回“0”
  • 尽量避免使用'get'或'getOrElse'
【解决方案2】:

您的错误来自于您没有对 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

【讨论】:

  • 好吧,如果我有Option[JsValue],如何将其转换为String
  • @Kevin maybeString.map(_.toString).getOrElse("defaultString"),但这将转换所有Some[JsValue](即仅当maybeString 为空时才给您“defaultString”)。我从您的问题中认为,如果您的 Option[JsValue] 恰好是 Some[JsString],则您想获得字符串表示形式,否则获得默认值。
  • (编辑以前的评论太慢了)只有当maybeStringNone时才会给你“defaultString” *
  • 我相信我了解您正在帮助我将Some(JsString) 转换为String,但是如果我有Some(JsValue) 怎么办? (对不起,如果我在重复自己的话。我只是没有看到如何从 Some(JsValue) 转到 String...)
  • maybeString.map(_.toString).getOrElse("default") 不工作吗?这应该采用任何Option[JsValue] 并返回其字符串表示形式,如果选项为空,则返回“默认”。错误信息是什么?
猜你喜欢
  • 2013-09-15
  • 2021-07-31
  • 2019-10-10
  • 2014-03-11
  • 2019-01-05
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多