json - 我需要关于 Play 的 Json 和 Writes trait 中优雅的 Option 处理的建议

标签 json scala playframework playframework-2.1

我在这里有一个“风格”或“有效的Scala”类型的问题:
我有一个“FeatureCheck”类,我需要将其序列化为 Json in Play 框架。

case class FeatureCheck(val result: Option[Boolean], val missing: Option[Array[String]], val error: Option[String])

我正在使用我自己的“写入”序列化它,但我的代码看起来很像 Java 代码。我想序列化检查对象中的每个选项,如果它被定义(最终对象不应该有任何空值)。
def writes(check: FeatureCheck): JsValue = {
  val builder = Seq.newBuilder[(String, JsValue)]
  if (check.error.isDefined) {
    builder += "error" -> JsString(check.error.get)
  }
  if (check.missing.isDefined) {
    builder += "missing" -> Json.toJson(check.missing.get)
  }
  if (check.result.isDefined) {
    builder += "result" -> JsBoolean(check.result.get)
  }
  JsObject(builder.result)
}

所以我想知道是否有办法在没有那些丑陋的 if-then 的情况下做到这一点,甚至删除序列的构建器。

感谢您提供的任何帮助或评论。

澄清:

假设我只想发送 result = true 我希望生成的 Json 是:
{"result":true} 

并不是
{
    "result": true,
    "error": null,
    "missing": []
}

最佳答案

鉴于您可以简单地将选项附加到 seq(请参阅 Add to list if value is not null ),您可以相当优雅地做您想做的事情:

type JsField = (String, JsValue)
def writes(check: FeatureCheck): JsValue = {
  JsObject(
    Seq[JsField]() ++
    check.error.map("error" -> JsString(_)) ++
    check.missing.map("missing" -> Json.toJson(_)) ++
    check.result.map("result" -> JsBoolean(_))    
  )
}

关于json - 我需要关于 Play 的 Json 和 Writes trait 中优雅的 Option 处理的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16277126/

相关文章:

scala - 从 Controller 中重构业务逻辑的好习惯方法

scala - SBT 0.10 - 移除对 Scala 2.8.1 的依赖

scala - 如何将 Scalaz 的 traverse 和 traverseU 与 Either 结合使用

java - 从同一后端支持移动应用程序和网站的最佳技术堆栈是什么?

android - 过滤后无法从 JSON 中获取 RecyclerView 中的数据

algorithm - 更改优先级队列中项目的优先级

java - Play Framework 如何从本地运行和 Web 应用程序引用 conf 文件夹中的文件作为 Java InputStream

java - 在java中选择查询(JPA)

json - 戈朗 : Parsing benchmarking between message pack and JSON

json - 在 Swift 中检查 Firebase 快照是否等于 nil