我想实现一个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))
当然,这不会编译,因为后续的 和
调用会生成 CanBuild3
和 Foo
的 unapply
生成一个 Tuple2
。我考虑过向结果附加一个值,生成一个 Tuple3
,但我发现 looks pretty bad和 language 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/