我有一个带有一些val
的case类(这不是构造函数参数)。如何在生成的json中获取这些字段?
我以前使用过Json4s
,并使用过FieldSerializer
来达到这个目的。但是无法通过Circe做到这一点。
我想要的是在特征中定义所有必填字段,有时,该字段可能是case类的一部分。但是在某些情况下,将它们保留为case类的一部分是没有意义的,但仍需要在json中使用。
请注意以下EntityWithBodyParams
和AnotherEntity
之间的区别。
这是我的案例案例类。
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"
}
答案 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")