如何在JSON中处理None值
我有一些在Playframework上下文中用Scala构建JSON对象的代码如何在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
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