Circe 解码到由多个案例类扩展的密封特征 [英] Circe Decode to sealed trait extended by multiple case classes

查看:50
本文介绍了Circe 解码到由多个案例类扩展的密封特征的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以前见过类似的问题,但没有一个有效.我认为他们会问一些不同的问题,所以我在这里问.我在一个文件中有这样的东西:

I've seen similar questions before, but none of them have worked. I think that they ask something different so I'm asking here. I have something like this in one file:

sealed trait Thing
case class SomeThing() extends Thing
case class OtherThing() extends Thing

并在另一个文件中:

val str = //valid json
val decoded = decode[Thing](str)
println(decoded)

我得到:

Left(DecodingFailure(...))

如果我这样做了,这会起作用:

This works if I did:

val str = //valid json
val decoded = decode[SomeThing](str)
println(decoded)

推荐答案

你可以使用 circe-generic-extras 并为你的 jsons 添加类型鉴别器:

you can use circe-generic-extras and add type discriminator for your jsons:

在你的 build.sbt 中:

In your build.sbt:

libraryDependencies ++= Seq(
  "io.circe" %% "circe-generic-extras" % "0.12.2",
  "io.circe" %% "circe-parser" % "0.12.2"
)

现在让我们定义我们的类并对其进行序列化+反序列化:

Now let's define our classes and serialize + deserialize them:

sealed trait Thing
case class SomeThing() extends Thing
case class OtherThing() extends Thing

import io.circe.generic.extras.auto._
import io.circe.generic.extras.Configuration
import io.circe.syntax._
import io.circe.parser

implicit val customConfig: Configuration =
  Configuration.default.withSnakeCaseMemberNames.withDiscriminator("type")

val thing: Thing = SomeThing()

// serialize thing to json
val jsString: String = thing.asJson.spaces2
println(s"serialized $thing to:\n$jsString")
/* serialized SomeThing() to:
{
"type" : "SomeThing"
}
*/

// deserialize json to thing
val errorOrMyTrait: Either[io.circe.Error, Thing] = parser.decode[Thing](jsString)

println(errorOrMyTrait) // Right(SomeThing())

注意,现在序列化的json包含密封类的类型

Notice that now the serialized json contains the type of the sealed class

这篇关于Circe 解码到由多个案例类扩展的密封特征的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆