在Play 2中如何检查JsValue变量是否为NULL?

时间:2015-06-26 03:10:38

标签: json scala playframework

这个问题可能闻起来很愚蠢,但我真的想知道如何在Play 2中检查NULL JsValue:

scala> import play.api.libs.json._
import play.api.libs.json._

scala> val json = Json.obj("a" -> true)
json: play.api.libs.json.JsObject = {"a":true}

scala> val a = json \ "nonExisting"
a: play.api.libs.json.JsValue = null

scala> a == null
res1: Boolean = false

scala> Option(a)
res2: Option[play.api.libs.json.JsValue] = Some(null)

您可以看到变量a的值为null,但==检查会返回false。但是,以下工作符合预期:

scala> val b: JsValue = null
b: play.api.libs.json.JsValue = null

scala> b == null
res3: Boolean = true

当我转向使用asOpt进行转换时,它似乎再次起作用:

scala> val c = json \ "a"
c: play.api.libs.json.JsValue = true

scala> c.asOpt[Boolean]
res4: Option[Boolean] = Some(true)

scala> a.asOpt[Boolean]
res5: Option[Boolean] = None

3 个答案:

答案 0 :(得分:4)

检查与play.api.libs.json.JsNull的平等程度:

if (a == JsNull) { ... }

a match {
  case JsNull => ...
}

答案 1 :(得分:3)

如果您在JavaScript中使用实际的JSON尝试了相同的操作,通常您会undefined而不是null。这由JsUndefined而不是JsNull表示。你可以改为寻找:

a.isInstanceOf[JsUndefined]

或通过使用模式匹配:

a match { case _: JsUndefined => true; case _ => false })

Scala强大的打字有多酷,准确反映了JSON的行为!? :)

答案 2 :(得分:0)

我认为最好/最安全的方法是利用选项:

val a = (json \ "nonExisting").asOpt[Boolean] // Or whatever type you might expect
if (a.isEmpty) {
  println("json does not contain key: nonExisting")
} else {
  println("nonExisting value: ${a.get}")
}