我正在使用外部服务,并且期望收到一个包含具有三种值的字段的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时,我将无法捕获(它将始终不存在) )。我该如何解决这个问题?
答案 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
上具有不错的组合器,例如map
,flatMap
,filter
等。
然后,您可以派生一个Play解码器/编码器,将对象置于正确的状态并适当地进行序列化。