ZIO JSON 이라는 ZIO Library 에서 사용할 수 있는 여러가지 기능이 있다.
sealed trait Fruit
case class Banana(curvature: Double) extends Fruit
case class Apple(poison: Boolean) extends Fruit
object Fruit {
implicit val encoder: JsonEncoder[Fruit] =
DeriveJsonEncoder.gen[Fruit]
}
val banana: Fruit = Banana(0.5)
위와 같은 코드에서 banana.json
은 {"banana":{"curvature":0.5}}
로 encoding 된다.
하지만 sealed trait
위에 @jsonDiscriminator("type")
를 붙여주면 encoding 방식이 아래와 같이 바뀐다.
{"type":"banana", "curvature":0.5}
@jsonDerive
어노테이션을 사용하면 JsonDecoder/JsonEncoder 를 빌드타임에 만들어 준다.
import zio.json._
@jsonDerive case class Watermelon(pips: Int)
위의 코드는 아래와 같이 빌드된다.
import zio.json._
case class Watermelon(pips: Int)
object Watermelon {
implicit val codec: JsonCodec[Watermelon] =
DeriveJsonCodec.gen[Watermelon]
}
여기서 Codec == Encoder + Decoder
이다.
만약 Encoder 만 만들고싶은 상황이라면 @jsonDerive(JsonDeriveConfig.Encoder)
와 같이 옵션을 주어 사용하면 된다.
이는 아래와 같이 빌드 된다.
import zio.json._
case class Watermelon(pips: Int)
object Watermelon {
implicit val encoder: JsonEncoder[Watermelon] =
DeriveJsonEncoder.gen[Watermelon]
}
Decoder 만 만들고 싶은 경우에도 똑같이 적용된다.
ref)
ZIO Doc