只有在没有其他条件的情况下scala(甚至不是默认值)

时间:2014-12-08 08:28:42

标签: json scala playframework

这可能是一个简单的问题,但我是Scala的新手并且无法找到合适的解决方案

我正在尝试从Option值创建一个JSON对象。将检查值是否为空然后创建Json obj,如果值为None我不想创建json对象。如果使用out,则缺省为else,这将无法创建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", "地点":"地点", " country":" country" }

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

选项是monad,使用它的方法很简单。 首先,如果要提取值,则应使用map或flatMap和getOrElse方法:

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

另一种方法是保留另一种类型的Option并使用后者:

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

您可以使用它来理解其他选项或执行其他突变而不提取:

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

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

并且总是尽量避免在monad上进行模式匹配。