[ZIO] ZIO JSON Library

Sangwoo Park·2023년 9월 1일
0

ZIO JSON 이라는 ZIO Library 에서 사용할 수 있는 여러가지 기능이 있다.

@jsonDiscriminator

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

@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

profile
going up

0개의 댓글