json - 使用 Play 的 (2.2) Scala JSON 组合器编写案例类中未找到的任意值

标签 json scala playframework functional-programming combinators

我想实现一个Writes,它发出一个在正在序列化的类中找不到的 JSON 对象。

对于案例类别:

case class Foo(i:Int, s:String)

我正在寻找生产:

{
  "i": <int>,
  "s": "<string>",
  "other": "Some value."
}

天真的第一次尝试是:

val writes: Writes[Foo] = ((
  (__ \ "i").write[Int] and
    (__ \ "s").write[String] and
    (__ \ "other").write("Some value.")
  )(unlift(Foo.unapply))

当然,这不会编译,因为后续的 调用会生成 CanBuild3Foounapply 生成一个 Tuple2。我考虑过向结果附加一个值,生成一个 Tuple3,但我发现 looks pretty badlanguage maintainers will not implement it .

有一些方法可以解决这个问题,但我不想用我想添加到生成的 JSON 中的这些装饰器值来污染我的模型类。

有什么建议吗?

值得注意的是,您可以走另一个方向,在 JSON 中不存在值但由结果对象指定的情况下,使用 Reads.pure 提供值.

最佳答案

您可以通过稍微脱糖来非常简单地做到这一点:

val writes: Writes[Foo] = (
  (__ \ "i").write[Int] and
  (__ \ "s").write[String] and
  (__ \ "other").write[String]
)(foo => (foo.i, foo.s, "Some value."))

unlift(Foo.unapply) 只是一种从 Foo 获取函数到前面的应用构建器表达式所需类型的元组的奇特方法,您可以将其替换为您自己的函数,该函数可以添加您想要的任何内容。

如果您确实想要更简洁的语法,您可以使用 Shapeless :

import shapeless.syntax.std.tuple._

val writes: Writes[Foo] = (
  (__ \ "i").write[Int] and
  (__ \ "s").write[String] and
  (__ \ "other").write[String]
)(_ :+ "Some value.")

它很漂亮,但可能有点过分了。

关于json - 使用 Play 的 (2.2) Scala JSON 组合器编写案例类中未找到的任意值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23019485/

相关文章:

playframework - 在 Play 应用程序中禁用延迟加载

javascript - Django——将字典传递给模板并绘制折线图

json - 我们可以在不使用循环的情况下获得oracle中列表属性的总和吗?

javascript - 使用 JSON 格式向 Javascript 对象添加元素不起作用

javascript - 对于 d3 力导向图,节点、组和值在 JSON 中意味着什么?

json - Play2 向 JsObject 添加新字段

scala - 如何从编译器插件中找到 Scala 程序中的语句?

Scala 示例 - 具有上下文边界错误的特征类型参数?

performance - 使用 Akka 从 Play 应用程序进行 Web 服务调用

scala - 关于驱动程序和配置文件的 playframework slick 弃用警告