如何在JSON中处理None值

如何在JSON中处理None值,json,scala,playframework,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

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

def toJson(): JsObject = Json.obj(
  "status" -> JsString(result.getOrElse("fail")),
  "age" -> JsNumber(age.getOrElse(0))
)
其中,结果和时间包装在选项中。年龄行中的getOrElse部分表示年龄不可用。这就是我想去的地方

结果是:

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

有没有办法绕过这个问题

问题B:问题A的解决方案是,如果年龄不可用,则省略年龄,因此结果如下所示:

{
status: "fail"
}
我不能在Json.obj(a,b,…)结构中乱来


那么,代码将如何实现这样的效果呢?

看看这样的效果是否适合您:

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

请选择哪个播放版本?@JulienLafont:Play 2.1.3