如何移除Circe asJson输出中Data字段的Case Class包装块?
解决方案
要移除Data字段中Case Class名称的外层包装,直接输出内部字段,可以利用circe的generic-extras模块配置编码规则,无需手动编写复杂的自定义编解码器。
修改后的代码示例
import io.circe.generic.extras._ import io.circe.syntax._ @ConfiguredJsonCodec sealed trait Data object Data { // 配置编码时不添加类型鉴别器(即去掉Case Class名称的外层键) implicit val config: Configuration = Configuration.default.withNoDiscriminator } case class Failed(foo: String, bar: String) extends Data case class Success(foo1: String, bar1: String) extends Data case class Task(Foo: String, Data: Data) val something = Task("test", Failed("1", "2")) println(something.asJson)
代码说明
- 替换导入依赖:用
circe-generic-extras的ConfiguredJsonCodec替代原有的auto导入,该模块支持自定义编码配置。 - 配置编码规则:在
Data的伴生对象中定义Configuration,调用withNoDiscriminator方法关闭默认的类型鉴别器(即不再用Case Class名称作为外层键包裹子类型字段)。 - 保留原有结构:
Failed、Success和Task的定义无需改动,配置会自动应用到所有Data的子类型。
执行结果
运行修改后的代码,输出将符合期望:
{"Foo" : "test", "Data" : {"foo" : "1", "bar" : "2"}}
内容的提问来源于stack exchange,提问作者Danny Wilcox
相关产品推荐
相关产品推荐

