如何通过忽略字段名大小写敏感度在scala中用circe解码json

如何通过忽略字段名大小写敏感度在scala中用circe解码json,json,scala,circe,Json,Scala,Circe,我有以下失败的测试用例: 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","t

我有以下失败的测试用例:

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)
}
解码失败,出现错误:

LeftProjection(Left(DecodingFailure([A]List[A], List(DownField(action), DownArray))))
解码器是否可以忽略大小写敏感度映射字段? 或者也许有一种优雅的方式来处理解码器。准备好了吗


谢谢

您可以尝试以下代码:

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))
}
导入io.circe_
导入io.circe.generic.auto_
对象循环扩展应用程序{
val actionJson=“”[
{“操作”:“视图”、“类型”:“产品”、“密钥”:“1210”},
{“操作”:“过滤器”,“类型”:“按价格”,“键”:“低-高”}
]“.stripMargin”
case类ActionRequest(action:String,`type`:String,key:String)
隐式val decodeActionJson:Decoder[ActionRequest]=(c:HCursor)=>{
val keysMapping=c.keys.get.groupBy(u.toLowerCase).map(kv=>(kv._1,kv._2.head))
为了{

actionField你找到答案了吗?谢谢anwser,但是为每个字段定义映射是很简单的,最好有一些隐式的方法来映射它们,而不是使用shapeless来泛化代码。我将在接下来的几天尝试提供一个示例。我认为没有一些模板代码是不可能的。啊,好吧,那会很有趣。是的,我想保存类型需要以某种方式进行显式处理。