为不同的 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))
}
我有以下 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))
}