这可能是一个简单的问题,但我是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" }
答案 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上进行模式匹配。