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
}
})