2015-06-26 8 views
6

Questa domanda può sentire l'odore stupido, ma voglio davvero sapere come controllare un NULL JsValue in Play 2:In Play 2 come verificare se una variabile JsValue è NULL?

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) 

Si può vedere il valore della variabile a è null ma il controllo == ritorna con false. Tuttavia le opere di seguito come previsto:

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

scala> b == null 
res3: Boolean = true 

E quando mi rivolsi a tipo di conversione con asOpt, sembra funzionare ancora:

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 

risposta

3

Se si è tentata la stessa operazione in JavaScript con JSON effettivo, normalmente si ottiene undefined non null. Questo è rappresentato da JsUndefined non JsNull. È possibile cercare questo, invece:

a.isInstanceOf[JsUndefined] 

o attraverso l'utilizzo di pattern matching:

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

Non è fantastico tipizzazione forte della Scala, che riflette con precisione il comportamento JSON !? :)

+0

Funziona davvero? Ricevo il seguente avviso durante la compilazione durante il test se 'myJsValue.isInstanceOf [JsUndefined]': 'test di tipo infruttuoso: un valore di tipo play.api.libs.json.JsValue non può anche essere un play.api.libs.json.JsUndefined ' – Blackbird

+0

Non funziona. 'val jsValue: JsValue = JsNull; Logger.info ("jsValue.isInstanceOf [JsUndefined]:" + jsValue.isInstanceOf [JsUndefined]) '-> visualizza' false' – Blackbird

+0

@Blackbird Questo perché null! = Undefined. – bjfletcher

4

Verificare la presenza di uguaglianza con play.api.libs.json.JsNull:

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

o

a match { 
    case JsNull => ... 
} 
+0

Purtroppo questo non funziona. 'a == JsNull' restituisce' false'. –

Problemi correlati