【问题标题】:Reuse Decoder For Different JSON payloads为不同的 JSON 有效负载重用解码器
【发布时间】:2021-08-29 03:36:54
【问题描述】:

我有以下 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] 的键值无关地工作?

【问题讨论】:

    标签: scala circe


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-29
      • 2021-03-06
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2014-07-21
      相关资源
      最近更新 更多