为不同的 JSON 有效负载重用解码器

Reuse Decoder For Different JSON payloads

我有以下 JSON 结构:

{
   "e":[],
   "r":{
      "foo":[
         [
            "abc",
            1
         ],
         [
            "def",
            2
         ],

      ]
   }
}

我正在尝试解码此结构并设置了以下情况class:

case class Baz(e : List[String], r : List[Data])

数据在哪里

case class Data(a : String, b : Int)

所以我按如下方式设置我的 circe 解码器:

object Data{
  implicit val decoder : Decoder[Data]  (c : HCursor) =>
   for {
     a <- c.downN(0).as[String]
     b <- c.downN(1).as[Int]
   }yield(Data(a,b))
  }

Baz 解码器的明显实现是


object Baz{
 implicit val decoder : Decoder[Baz]  (c : HCursor) =>
 for {
   e <- c.downField("e").as[List[String]]
   r <- c.downField("r").downField("foo").as[List[Data]]
}yield(Baz(e,r))

}

但是,我想对其他 JSON 值使用相同的 Baz 解码器,这些值仅在键名“foo”上有所不同。也就是说,“foo”可能是“bar”之类的东西。

如何 tell/move 游标使其工作而不管 List[Data] 的键值如何?

使用 Map 编码将允许您重新使用解码器并使用相同结构的任何 JSON 值:


object Baz{
 implicit val decoder : Decoder[Baz]  (c : HCursor) =>
 for {
   e <- c.downField("e").as[List[String]]
   r <- c.downField("r").as[Map[String, List[Data]]]
 }yield(Baz(e,r))
}