在Circe解码器中是否有可选字段的方法?

12

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

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个回答

26

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接