Scala circe类型字段未显示

Scala circe类型字段未显示,scala,circe,Scala,Circe,当使用circe编码为Json时,我们真的希望type字段显示,例如 scala> val fooJson = foo.asJson fooJson: io.circe.Json = { "this_is_a_string" : "abc", "another_field" : 123, "type" : "Foo" } 这是从之前提到的发行说明中获取的,您可以如下配置编码: implicit val customConfig: Configuration = Config

当使用circe编码为Json时,我们真的希望
type
字段显示,例如

scala> val fooJson = foo.asJson
fooJson: io.circe.Json =
{
  "this_is_a_string" : "abc",
  "another_field" : 123,
  "type" : "Foo"
}
这是从之前提到的发行说明中获取的,您可以如下配置编码:

implicit val customConfig: Configuration = 
Configuration.default.withSnakeCaseKeys.withDefaults.withDiscriminator("type")
另外,关于circe的其他信息表明,如果没有任何配置,您应该在编码json中获得一些类类型信息


我错过什么了吗?如何显示课程类型?

2017年3月30日更新:OP评论的后续行动

我能够做到这一点,如图所示

准备步骤1:向build.sbt添加其他依赖项

libraryDependencies += "io.circe" %% "circe-generic-extras" % "0.7.0"
准备步骤2:设置虚拟特征层次结构

import io.circe.{ Decoder, Encoder }
import io.circe.parser._, io.circe.syntax._
import io.circe.generic.extras.Configuration
import io.circe.generic.extras.auto._
import io.circe.generic.{ semiauto => boring } // <- This is the default generic derivation behaviour
import io.circe.generic.extras.{ semiauto => fancy } // <- This is the new generic derivation behaviour

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

sealed trait Stuff
case class Foo(thisIsAString: String, anotherField: Int = 13) extends Stuff
case class Bar(thisIsAString: String, anotherField: Int = 13) extends Stuff

object Foo {
  implicit val decodeBar: Decoder[Bar] = fancy.deriveDecoder
  implicit val encodeBar: Encoder[Bar] = fancy.deriveEncoder
}

object Bar {
  implicit val decodeBar: Decoder[Bar] = boring.deriveDecoder
  implicit val encodeBar: Encoder[Bar] = boring.deriveEncoder
}
导入io.circe.{解码器、编码器}
导入io.circe.parser.\u,io.circe.syntax_
导入io.circe.generic.extras.Configuration
导入io.circe.generic.extras.auto_

import io.circe.generic.{semiauto=>boring}//fancy}//看起来这可能已经被取消了。上面提到的发行说明说明是这样配置的:感谢更新-这是我发现的,你抢先回答了我。需要注意的一点是,在我的例子中,我必须
导入io.circe.generic.extras.auto.\u
即在作用域中使用“extras”,否则它将无法工作。
val foo: Stuff = Foo("abc", 123)
val bar: Stuff = Bar("xyz", 987)

val fooString = foo.asJson.noSpaces
// fooString: String = {"thisIsAString":"abc","anotherField":123,"type":"Foo"}

val barString = bar.asJson.noSpaces
// barString: String = {"thisIsAString":"xyz","anotherField":987,"type":"Bar"}

val bar2 = for{
  json <- parse(barString)
  bar2 <- json.as[Stuff]
} yield bar2
// bar2: scala.util.Either[io.circe.Error,Stuff] = Right(Bar(xyz,987))

val foo2 = for{
  json <- parse(fooString)
  foo2 <- json.as[Stuff]
} yield foo2
// foo2: scala.util.Either[io.circe.Error,Stuff] = Right(Foo(abc,123))