【问题标题】:How to handle None values in JSON如何处理 JSON 中的 None 值
【发布时间】:2013-10-03 21:16:31
【问题描述】:

我有一些代码可以在 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, ...) 构造中乱来...

那么代码应该如何实现这样的功能?

【问题讨论】:

  • 请问哪个 Play 版本?
  • @JulienLafont:玩 2.1.3

标签: json scala playframework


【解决方案1】:

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

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 的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多