首页 > 解决方案 > 为不同的 JSON 有效负载重用解码器

问题描述

我有以下 JSON 结构:

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

      ]
   }
}

我正在尝试解码此结构并设置了以下案例类:

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

}

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

我如何告诉/移动光标,使其与 List[Data] 的键值无关地工作?

标签: scalacirce

解决方案


使用Map编码将允许您重新使用解码器并 slurp 相同结构的任何 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))
}


推荐阅读