3

我有以下 obj 是 a JsObject

val approx_pieces: Option[String] = (obj \ "approx_pieces").asOpt[String]

Some("0")如果数据库中的大约件数为“0”,此代码将创建一个。

如何更改它以便None在字符串为“0”时创建它?

4

1 回答 1

8

如果您已经有一个Option,并且您不想在某些情况下使用该值,那么filter这是您最惯用的选择:

val one = Option("1")
val zero = Option("0")
one.filter(_ != "0") //Some("1")
zero.filter(_ != "0") //None

使用此方法,您的解决方案将是:

(obj \ "approx_pieces").asOpt[String].filter(_ != "0")

或者,您可以使用match语句来执行此操作。Play 中的JsValue子类型都有一个unapply方法,所以你可以直接匹配它们:

(obj \ "approx_pieces") match {
    case JsString(num) if num != "0" => Some(num)
    case _ => None
}

您可能还对该collect方法感兴趣:

(obj \ "approx_pieces").asOpt[String] collect {
    case num if num != "0" => num
}

collect很好,因为它允许您同时过滤和映射。

您也可以同时使用上述两种方法:

Option(obj \ "approx_pieces") collect {
    case JsString(num) if num != "0" => num
}
于 2015-03-13T13:40:38.440 回答