Scala Play隐式读取catch空

时间:2018-08-02 10:49:46

标签: json scala serialization playframework


我正在使用外部服务,并且期望收到一个包含具有三种值的字段的json:

  • 双重
  • 该字段可能不存在

我需要将json反序列化为case类,而在代码中的其他地方,我需要将其序列化为具有相同字段的json。
我有一个隐式的读写:

implicit lazy val aReads: Reads[A] = (
  "foo".readNullable[Double]
)(A.apply _)

implicit lazy aWrites: OWrites[A] = (
  "foo".write[Option[Double]]
)

和案例类:

case class A(
  foo: Option[Double]
)

您可以想象问题是,当值不存在时,我无法“捕获”,并且如果使用"foo".writeNullable[Double]作为编写者,则在其为null时,我将无法捕获(它将始终不存在) )。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您实际上需要的是一种反映三种状态的数据类型:

  • 现在
  • 不存在

实际上有一个nice encoding of this here,在语义上等效于:

sealed trait Tristate[+A]
case class Present[+A](a: A) extends Tristate[A]
case object Absent extends Tristate[Nothing] // this can represent your "null" state
case object NonExisting extends Tristate[Nothing]

链接的小型库在Tristate上具有不错的组合器,例如mapflatMapfilter等。

然后,您可以派生一个Play解码器/编码器,将对象置于正确的状态并适当地进行序列化。