有没有办法在 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)
}
我有一个案例 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)
}