Circe: Сериализация полей тела класса case в JSON - PullRequest
0 голосов
/ 24 октября 2018

У меня есть класс case с некоторым значением val (которое не является параметром конструктора).Как я могу получить эти поля также в сгенерированном 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"
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Попробуйте вместо этого написать свой класс дел.

case class EntityWithBodyParams(id:Long, val name:String = "Name")
0 голосов
/ 24 октября 2018

Вы можете создать свои собственные 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)
  )
}

Причиной такого поведения является тот факт, что автоматический кодировщик circe использует только product поля класса дела.Более подробную информацию вы можете найти здесь https://github.com/milessabin/shapeless

...