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

XuC*_*LIU 8 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)
Run Code Online (Sandbox Code Playgroud)

你可以看到变量的值anull,但==与检查的回报false.但是,以下工作符合预期:

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

scala> b == null
res3: Boolean = true
Run Code Online (Sandbox Code Playgroud)

当我转向使用类型转换时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
Run Code Online (Sandbox Code Playgroud)

Rad*_*sky 5

检查与 的相等性play.api.libs.json.JsNull

if (a == JsNull) { ... }
Run Code Online (Sandbox Code Playgroud)

或者

a match {
  case JsNull => ...
}
Run Code Online (Sandbox Code Playgroud)


bjf*_*her 3

如果您在 JavaScript 中尝试使用实际的 JSON 进行相同的操作,通常您会得到undefinednot null。这由JsUndefinednot表示JsNull。你可以找这个代替:

a.isInstanceOf[JsUndefined]
Run Code Online (Sandbox Code Playgroud)

或通过使用模式匹配:

a match { case _: JsUndefined => true; case _ => false })
Run Code Online (Sandbox Code Playgroud)

Scala 的强类型准确反映了 JSON 行为,这有多酷!?:)