如何在JSON中处理无值

时间:2013-10-03 12:25:37

标签: json scala playframework

我有一些代码在Playframework上下文中在Scala中构建JSON对象

def toJson(): JsObject = Json.obj(
  "status" -> JsString(result.getOrElse("fail")),
  "age" -> JsNumber(age.getOrElse(0))
)

结果和年龄包含在选项中。年龄行中的getOrElse部分表示年龄不可用。这就是我想要解决的问题。

结果输出为:

{
status: "fail",
age: 0
}

问题A:在示例中,age为None,因此getOrElse返回0,客户端必须将其解释为具有特殊含义的某个幻数。我想返回类似None的内容,但play.api.libs.json.JsNumber需要一个scala.BigDecimal。

有没有办法以某种方式解决这个问题?

问题B:问题A的解决方案是在不可用的情况下省略年龄,结果如下:

{
status: "fail"
}

我不能在Json.obj(a,b,...)构造中乱七八糟......

那么代码如何实现这样的目标?

1 个答案:

答案 0 :(得分:2)

看看这样的东西是否适合你:

val fields:Seq[Option[(String,JsValueWrapper)]] = Seq(
  result.map(s => ("status", JsString(s))),
  age.map(i => ("age", JsNumber(new BigDecimal(i))))
)
val finalFields = fields.flatten

Json.obj(finalFields:_*)   

当Seq变平时,其中的None类型应该被移除,因此不会成为结果JsObject的一部分。