这个问题可能闻起来很愚蠢,但我真的想知道如何在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
答案 0 :(得分:4)
答案 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}")
}