Json 将JsValue转换为字符串
通读本文,我不知道如何将我的Json 将JsValue转换为字符串,json,scala,playframework-2.0,Json,Scala,Playframework 2.0,通读本文,我不知道如何将我的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
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]
您的错误源于您没有对x的类型施加足够的条件:
maybeString
是一个选项[JsValue]
,而不是选项[JsString]
。如果maybeString
不是选项[JsString]
,转换将失败并引发异常
您可以这样做:
val str: String = maybeString match {
case Some(x:JsString) => x.as[String]
case _ => "0"
}
或者您可以使用
asOpt[T]
而不是as[T]
,后者返回Some(u.as[String])
,如果转换成功,则返回None
。您想要组合多个选项,这就是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")
(用于{
json好吧,如果我有选项[JsValue]
,我怎么能把它转换成字符串呢?@KevinmaybeString.map(u.toString.getOrElse(“defaultString”)
,但这将转换所有部分[JsValue]
(即只有当maybeString
为空时才给你“defaultString”)。我想从你的问题中,如果你的选项[JsValue]
碰巧是某个[JsString]
的话,你想得到字符串表示形式,否则就得到默认值。(编辑之前的注释太慢了)它会给你“defaultString”只有当maybeString
是None
*我相信我理解你在帮助我如何将Some(JsString)
转换为String
,但是如果我有Some(JsValue)
,那该怎么办?(如果我重复我自己的话,很抱歉。我只是不知道如何从Some(JsValue)转换为String…)maybeString.map(u.toString).getOrElse(“默认”)
不起作用吗?这应该使用任何选项[JsValue]
并返回其字符串表示形式,如果该选项为空,则返回“default”。错误消息是什么?如果您确定有一个JsString:maybeString.map(u.toString)好的-您的第一个实现对我来说是成功的。我使用了asOpt[Long]
,因为asOpt[String]
不匹配,即返回“0”,请尝试避免使用“get”或“getOrElse”