2014-12-08 44 views
-1

这可能是简单的问题,但我是新来的Scala和不能够找到妥善解决斯卡拉只有当条件没有别人(甚至默认)

我试图创建选项值JSON对象。将检查值是否为空然后创建Json obj,如果值为None我不想创建json对象。随着出意外,默认其他人是单位,这将无法创建的Json OBJ

Json.obj(if(position.nonEmpty) ("position" -> position.get), 
     if(place.nonEmpty) ("place" -> place.get), 
     if(country.nonEmpty) ("country" -> country.get)) 

需要把If条件,使最终的JSON字符串看起来像

{ “位置”:“M2” , “地方”: “地方”, “国”: “国家” }

回答

0
val obj = for { 
    p <- position  
    o <- otherOption 
    ... 
} yield Json.obj(
    "position" -> p, 
    "other" -> o) 

只会产生JSON对象的Some如果所有选项的定义。否则None

+0

感谢@Martin Ring响应。值(位置,地点,...)不在列表中。它的案例分类参数是选项。 – 2014-12-08 08:52:08

+0

他们不能在列表中工作。 – 2014-12-08 10:29:29

0

选项是一个monad,使用它的方法很少。 首先,如果你想提取的值,你应该使用地图或flatMap和getOrElse方法:

val res = position.map(value => Json.obj("position" -> value)).getOrElse(null) 

另一种方式是保持另一种类型的选项,并用它后者:

val jsonOption = position.map(value => Json.obj("position" -> value)) 

后,您可以用它来理解另一个选项或者在不提取的情况下执行另一个突变:

for (positionJson <- jsonOption; xJson <- xJsonOption) yield positionJson.toString + xJson.toString 

jsonOption.map(_.toString).foreach(print(_)) 

并且总是试图避免monads上的模式匹配。