scala Pascal事例变换在枚举事例解析中的应用

2w2cym1i  于 12个月前  发布在  Scala
关注(0)|答案(1)|浏览(207)

下面是JSON:

[{"type": "first_variant", ...}, {"type": "second_variant", ...}]

字符串
我想把这个JSON解析成一个Variant枚举数组,如下所示:

enum Variant:
  case FirstVariant(...)
  case SecondVariant(...)


如何使用circe

sg3maiej

sg3maiej1#

在Scala 3和Circe 0.14.6中,您可以通过提供适当的ConfigurationCodec来要求snake大小写中的一个字段:

//> using lib io.circe::circe-core:0.14.6
//> using lib io.circe::circe-generic:0.14.6

import io.circe.Codec
import io.circe.syntax.EncoderOps
import io.circe.derivation.Configuration
import io.circe.generic.auto.given

enum Variant:
  case FirstVariant(x: Int)
  case SecondVariant(y: String)

given Configuration =
  Configuration
    .default
    .withDiscriminator("type")
    .withSnakeCaseConstructorNames

given Codec[Variant] =
  Codec.AsObject.derivedConfigured

@main def example =
  val l = List(
    Variant.FirstVariant(1),
    Variant.SecondVariant("hello")
  )
  val lJson = l.asJson
  println(lJson)
  val l2 = lJson.as[List[Variant]].toOption.get
  assert(l2 == l)

字符串
这将产生:

[
  {
    "x" : 1,
    "type" : "first_variant"
  },
  {
    "y" : "hello",
    "type" : "second_variant"
  }
]


参考文献:我从(过时的)Circle关于ADT的文档the answer to a similar question for Circe 0.7.0和Circe 0.14.6(Configuration.scalaConfiguredDerivesSuite.scala)的源代码中导出了这个例子。

相关问题