繁体   English   中英

Circe:将案例类主体字段序列化为JSON

[英]Circe : Serialize case class body fields to JSON

我有一个带val的case类(这不是构造函数参数)。 如何在生成的json中获取这些字段?

我用Json4s前,并用FieldSerializer它做这一招。 但是无法用Circe做到这一点。

我想要的是在特征中定义所有必填字段,有时,该字段可能是case类的一部分。 但是在某些情况下,将它们保留为case类的一部分是没有意义的,但仍需要在json中使用。 请注意下面的EntityWithBodyParamsAnotherEntity之间的区别。

这是我的案例案例类。

trait NamedEntity {
    def name:String
}

case class EntityWithBodyParams(id:Long) extends NamedEntity {
  override val name:String = "Name"
}

case class AnotherEntity(id:Long, name:String) extends NamedEntity 

asJson之后的回应

{
  "id" : 100
}

但是我的期望是:

{
  "id" : 100,
  "name":"Name"
}

您可以创建自己的Encoder

import io.circe.{Encoder, Json}

case class EntityWithBodyParams(id: Long) {
  val name: String = "Name"
}

implicit val encoder: Encoder[EntityWithBodyParams] = new 
Encoder[EntityWithBodyParams] {
  override def apply(entity: EntityWithBodyParams): Json = Json.obj(
    "id"   -> Json.fromLong(entity.id),
    "name" -> Json.fromString(entity.name)
  )
}

出现这种情况的原因是,circ自动编码器仅使用案例类的product字段。 您可以在这里找到更多信息https://github.com/milessabin/shapeless

尝试像这样编写案例类。

case class EntityWithBodyParams(id:Long, val name:String = "Name")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM