有没有办法在 Circe 解码器中包含可选字段?

Is there a way to have optional fields in a Circe decoder?

我有一个案例 class,其中每个字段都是可选的,例如:

case class Foo(name: Option[String],
               phone: Option[String],
               email: Option[String])

我试图为我的案例创建一个手动解码器 class,发现解码器类似于:

implicit val decoder: Decoder[Foo] = (c: HCursor) => {
  for {
    name <- c.downField("name").as[String]
    phone <- c.downField("phone").as[String]
    email <- c.downField("email").as[String]
  } yield {
    new Foo(name, phone, email)
  }
}

但是检查downField方法,如果没有设置字段,光标会变成FailedCursor,所以会报错。

如果某些字段未定义,我怎么能期望它是可选的并且 return None

只需使用c.downField.as[Option[T]],所以你的代码将是这样的:

implicit val decoder: Decoder[Foo] = (c: HCursor) => {
  for {
    name <- c.downField("name").as[Option[String]]
    phone <- c.downField("phone").as[Option[String]]
    email <- c.downField("email").as[Option[String]]
  } yield new Foo(name, phone, email)
}