2015-06-26 3 views
6

यह सवाल बेवकूफ गंध सकता है, लेकिन मैं वास्तव में खेलने के 2 में एक शून्य JsValue जांच करने का तरीका जानना चाहता हूँ:प्ले 2 में कैसे जांचें कि कोई जेएसवेल्यू वैरिएबल न्यूल है या नहीं?

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 साथ रूपांतरण टाइप करने के लिए बदल गया है, यह फिर से काम लगता है: play.api.libs.json.JsNull साथ समानता के लिए

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

यदि आपने वास्तविक JSON के साथ जावास्क्रिप्ट में एक ही ऑपरेशन की कोशिश की है, तो आमतौर पर आपको undefinednull नहीं मिलेगा। यह JsUndefinedJsNull द्वारा दर्शाया गया है। आप इस के बजाय के लिए देख सकते हैं:

पैटर्न मिलान का उपयोग कर के माध्यम से
a.isInstanceOf[JsUndefined] 

या:

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

कैसे शांत है कि स्काला के मजबूत टाइपिंग, सही ढंग से JSON व्यवहार को दर्शाती है !? :)

+0

क्या यह वास्तव में काम करता है? मुझे परीक्षण करते समय संकलन के दौरान निम्नलिखित चेतावनी मिलती है जब 'myJsValue.isInstanceOf [JsUndefined] ':' फलहीन प्रकार परीक्षण: play.api.libs.json.JsValue का एक प्रकार play.api.libs.json.JsUndefined भी नहीं हो सकता है ' – Blackbird

+0

काम नहीं करता है। 'वैल जेएस वैल्यू: जेएसवेल्यू = जेएसनुल; Logger.info ("jsValue.isInstanceOf [JsUndefined]:" + jsValue.isInstanceOf [JsUndefined]) '-> प्रदर्शित करता है' झूठा ' – Blackbird

+0

@ ब्लैकबर्ड ऐसा इसलिए है क्योंकि शून्य! = अपरिभाषित। – bjfletcher

4

की जांच:

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

या

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

दुर्भाग्य से यह काम नहीं करता है। 'ए == जेएसएनयूएल 'झूठा' देता है। –

संबंधित मुद्दे