I have the following failing test case:
case class ActionRequest(action: String, `type`:String, key: String)
"Actions " should " be decoded correctly" in {
val actionJson =
"""[
|{"Action":"view","Type":"Product","Key":"1210"},
|{"action":"filter","type":"by-price","key":"low-hi"}
|]
|""".stripMargin
val actions = decode[List[ActionRequest]](actionJson).right.getOrElse(List())
assert(actions.size == 2)
}
decoding fails with error:
LeftProjection(Left(DecodingFailure([A]List[A], List(DownField(action), DownArray))))
Is it possible for the decoder to map fields ignoring the case sensitivity? Or maybe there is an elegant way handle this with decoder.prepare?
Thanks!
You can try the following code:
import io.circe._
import io.circe.generic.auto._
object CirceApp extends App {
val actionJson = """[
{"Action":"view","Type":"Product","Key":"1210"},
{"action":"filter","type":"by-price","key":"low-hi"}
]""".stripMargin
case class ActionRequest(action: String, `type`: String, key: String)
implicit val decodeActionJson: Decoder[ActionRequest] = (c: HCursor) => {
val keysMapping = c.keys.get.groupBy(_.toLowerCase).map(kv => (kv._1, kv._2.head))
for {
actionField <- c.downField(keysMapping("action")).as[String]
typeField <- c.downField(keysMapping("type")).as[String]
keyField <- c.downField(keysMapping("key")).as[String]
} yield {
ActionRequest(actionField, typeField, keyField)
}
}
println(decode[Seq[ActionRequest]](actionJson))
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With