gpt4 book ai didi

json - 如何通过忽略字段名区分大小写来使用 circe 在 scala 中解码 json

转载 作者:行者123 更新时间:2023-12-01 06:02:50 25 4
gpt4 key购买 nike

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

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))))

解码器是否可以忽略区分大小写来映射字段?
或者也许有一种优雅的方式使用decoder.prepare来处理这个问题?

谢谢!

最佳答案

您可以尝试以下代码:

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))
}

关于json - 如何通过忽略字段名区分大小写来使用 circe 在 scala 中解码 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43344094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com