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 this simple example to a JSON string
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 very far:
object JsonProtocol {
implicit val productDecoder: Decoder[Product] = deriveDecoder
implicit val productEncoder: Encoder[Product] = deriveEncoder
}
resulted in 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? But, I'm only guessing.
Try defining your own encoders and decoders for the enum using:
something like:
These are needed because the automatic/semiautomatic derivers only work for hierarchies of
sealed trait
s andcase classes
as far as I know. The reason you see that error is because the derived codecs forProduct
will implicitly require encoders/decoders for the types of each of it's parameters. An encoder/decoder forString
is a standard part of Circe, but you'll probably need to create ones for your own enumerations.Have a look at enumeratum if you want to use enumerations with circe. You could then try something like this:
This should work with circe's automatic derivation for use with your case classes.