case class RubricId(value: Int) extends AnyValDesired result
import io.circe.syntax._
RubricId(1).asJson{
"id": 1
}import io.circe.Encoder
import io.circe.generic.semiauto.deriveEncoder
implicit val encoderRubricId: Encoder[RubricId] = deriveEncoder[RubricId]{
"id": {
"value": 1
}
}import io.circe.generic.JsonCodec
@JsonCodec(encodeOnly = true) case class RubricId(value: Int) extends AnyVal{
"id": {
"value": 1
}
}import io.circe.Encoder
implicit val encRubricId: Encoder[RubricId] = new Encoder[RubricId] {
def apply(a: RubricId): Json = Encoder.encodeInt(a.value)
}{
"id": 1
}import io.circe.Encoder
def anyValEncoder1[A : Encoder, B <: Product with AnyVal]: Encoder[B] = new Encoder[B] {
def apply(a: B): Json = Encoder.apply[A].apply(a.productElement(0).asInstanceOf[A])
}
implicit val encoderRubricId: Encoder[RubricId] = anyValEncoder1[Int, RubricId](-): нужно указывать тип value значения - не удобно поддерживать при изменении сигнатуры AnyVal класса
{
"id": 1
}import io.circe.Encoder
def anyValEncoder2[A : Encoder, B <: Product with AnyVal](cons: A => B): Encoder[B] = new Encoder[B] {
def apply(a: B): Json = Encoder.apply[A].apply(a.productElement(0).asInstanceOf[A])
}
implicit val encoderRubricId: Encoder[RubricId] = anyValEncoder2(RubricId)(-): немного вводит в заблуждение apply метод у RubricId как cons, но он подсказывает типы
(+): не нужно поддерживание изменение сигнатуры AnyVal класса
{
"id": 1
}import io.circe.Encoder
import io.circe.syntax._
def anyValEncoder3[A : Encoder, B <: Product with AnyVal](cons: A => B): Encoder[B] = new Encoder[B] {
def apply(a: B): Json = a.productElement(0).asInstanceOf[A].asJson
}
implicit val encoderRubricId: Encoder[RubricId] = anyValEncoder3(RubricId)(+) выбор пал на этот вариант
{
"id": 1
}