2015-06-26 3 views
6

Этот вопрос может пахнуть глупо, но я действительно хочу знать, как проверить NULL JsValue в Play 2:В Play 2 как проверить, является ли переменная 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) 

Вы можете увидеть значение переменной 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

Если вы пробовали такую ​​же операцию в JavaScript с фактическим JSON, как правило, вы получите undefined не null. Это представлено JsUndefined не JsNull. Вы можете искать вместо этого:

a.isInstanceOf[JsUndefined] 

или путем использования сопоставления с образцом:

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

Как здорово, что строгая типизация в Scala, точно отражает поведение JSON !? :)

+0

Действительно ли это работает? Во время компиляции я получаю следующее предупреждение: 'myJsValue.isInstanceOf [JsUndefined]': 'бесплодный тест типа: значение типа play.api.libs.json.JsValue также не может быть play.api.libs.json.JsUndefined ' – Blackbird

+0

Не работает. 'val jsValue: JsValue = JsNull; Logger.info ("jsValue.isInstanceOf [JsUndefined]:" + jsValue.isInstanceOf [JsUndefined]) '-> отображает' false' – Blackbird

+0

@Blackbird Это потому, что null! = Undefined. – bjfletcher

4

Проверка на равенство с play.api.libs.json.JsNull:

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

или

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

К сожалению, это не сработает. 'a == JsNull' возвращает' false'. –

Смежные вопросы