Scala 如何让Circe跳过枚举中的某些值?

Scala 如何让Circe跳过枚举中的某些值?,scala,circe,Scala,Circe,我们有这样一个“枚举”: 此结构由我们的领域/需求决定。但是,我想将此StatusEnumeration转换为输出JSON,如下所示: case class Root(status: StatusEnumeration) 我已经设置了以下隐式编码器,它可以按预期工作: implicit val encoder = deriveEnumerationEncoder[StatusEnumeration] 但是,如果StatusEnumeration设置为Status.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
    }

  })

这似乎确实如预期的那样起作用。这是推荐的方法还是有更好的方法?

没有尝试编译此方法,但基于Scaladocs,您应该能够做到:

implicit val encoder=encoder.encodeOption(deriveEnumerationEncoder[StatusEnumeration])
.对照图{
案例未知=>无
案例已知=>Some(已知)
}

基本上,构造一个编码器
选项[StatusEnumeration]
,然后将
状态枚举
映射到相应的编码器上(我很确定
选项
的编码器将
设置为
一些(x)
设置为
x
编码)例如
implicit val encoder=deriveEnumerationEncoder[StatusEnumeration].mapJson(json=>json.asString match{case Some(“Unknown”)=>json.Null;case =>json})
@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
    }

  })