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

时间:2018-02-07 21:16:40

标签: scala circe

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

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

我正在尝试为我的案例类创建一个手动解码器,并发现解码器类似于:

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,因此错误将会增加。

我如何期望某些字段是可选字段,如果未定义则返回None

1 个答案:

答案 0 :(得分:6)

只需使用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)
}