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

时间:2018-10-24 05:33:53

标签: json scala circe

我有一个带有一些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"
}

2 个答案:

答案 0 :(得分:0)

您可以创建自己的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自动编码器仅使用case类的product字段。您可以在这里https://github.com/milessabin/shapeless

找到更多信息

答案 1 :(得分:0)

尝试像这样编写案例类。

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