-->

如何获得瑟茜从枚举跳过某些值?(How to get Circe to skip certain v

2019-09-28 05:39发布

我们有一个“枚举”,例如:

sealed abstract class StatusEnumeration(val value: String)
case object Status {
  case object Mine extends StatusEnumeration("mine")
  case object Someone extends StatusEnumeration("someone")
  case object Neighbor extends StatusEnumeration("neighbor")
  case object Unknown extends StatusEnumeration("unknown")
}

这种结构是通过我们的域/需求决定的。 但是,我想将其转换StatusEnumeration为输出JSON像这样:

case class Root(status: StatusEnumeration)

我给自己定了以下隐含的编码器,它按预期工作:

implicit val encoder = deriveEnumerationEncoder[StatusEnumeration]

但是, 如果 StatusEnumeration设置为Status.Unknown我想为值代被跳过或只输出一个null ,而不是(我可以然后通过降dropNullValues )。 我怎么能这样做? 它甚至有可能或者我需要重新定义另一组枚举的?

到目前为止,这是我试图在@Alec还评论尝试类似的东西:

implicit val encoder = deriveEnumerationEncoder[StatusEnumeration].mapJson(x=>{

    x.asString match {
      case Some("Unknown") => Json.Null
      case Some(s) => Json.fromString(s.toLowerCase) // output expect lowercase - not sure if the consumer is case-sensitive
      case None => Json.Null
    }

  })

这似乎按预期方式工作。 这是推荐的方式或者是有一个更好的?

Answer 1:

没试过编译这个,而是基于你应该能够做到Scaladocs:

implicit val encoder = Encoder.encodeOption(deriveEnumerationEncoder[StatusEnumeration])
  .contramap {
    case Unknown => None
    case known => Some(known)
  }

基本上,构建编码器Option[StatusEnumeration]然后映射StatusEnumeration到是否发生相应(我确信对于编码器Option使NonenullSome(x)x的编码)。



文章来源: How to get Circe to skip certain values from the enumeration?
标签: scala circe