【发布时间】:2020-12-08 12:39:46
【问题描述】:
我必须使用一个 json api,其中有一个蛇案例中的离散字符串值列表。
以下示例有效,但我想删除手动 fooDecoder 以支持(当前已注释掉的)ConfiguredJsonCodec 注释。
或更基本的问题:将这些离散值建模为 ADT 中的案例对象是否有意义,或者是否有其他方法?
import io.circe._
import io.circe.syntax._
import io.circe.generic.extras.{Configuration, ConfiguredJsonCodec, JsonKey}
import io.circe.parser.parse
implicit val jsonConfig: Configuration = Configuration.default
.withSnakeCaseConstructorNames
.withSnakeCaseMemberNames
//@ConfiguredJsonCodec(decodeOnly = true)
sealed trait Foo
object Foo {
case object FooBar extends Foo
case object FooBaz extends Foo
case object FooWuz extends Foo
}
import Foo._
implicit val fooDecoder: Decoder[Foo] = new Decoder[Foo] {
override def apply(c: HCursor) = c.as[String].map{
case "foo_bar" => FooBar
case "foo_baz" => FooBaz
case "foo_wuz" => FooWuz
}
}
@ConfiguredJsonCodec(decodeOnly = true)
case class Qux(fooFoo: List[Foo])
val input ="""{"foo_foo" : ["foo_bar", "foo_baz", "foo_wuz"]}"""
val json: Json = parse(input).left.map(println(_)).right.get
json.as[Qux]
完整示例:https://scastie.scala-lang.org/eVFyNMGFRgaw9oEkRveT8g
这使用大约 0.13.0
【问题讨论】: