Search code examples
jsonscalacirce

Circe and Scala's Enumeration type


I'm trying to wrap my head around Circe.

So, here's the model I've been given:

object Gender extends Enumeration {
     type Gender = Value
     val Male, Female, Unisex, Unknown = Value
}

case class Product(id: String, gender: Gender.Value)

I want to

a) encode the following example as JSON

        val product = Product(id = "1234", gender = Gender.Female)

b) map the resulting JSON back onto the Product case class.


My own attempt didn't get me far:

  object JsonProtocol {
      implicit val productDecoder: Decoder[Product] = deriveDecoder
      implicit val productEncoder: Encoder[Product] = deriveEncoder
  }

result is a compile time error

   Error:(52, 49) could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[A]
   implicit val productDecoder: Decoder[Product] = deriveDecoder
                                            ^

I've no idea why this exception is thrown and what the solution could look like. Maybe it's the usage of the Enumeration type?


Solution

  • The accepted answer is deprecated (circe 0.12.0).

    Circe provides now these functions:

    Decoder.decodeEnumeration[E <: Enumeration](enum: E)
    Encoder.encodeEnumeration[E <: Enumeration](enum: E)
    

    With the example:

    implicit val genderDecoder: Decoder[Gender.Value] = Decoder.decodeEnumeration(Gender)
    implicit val genderEncoder: Encoder[Gender.Value] = Encoder.encodeEnumeration(Gender)