scala - 为不同的 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] 的键值无关地工作?
解决方案
使用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))
}
推荐阅读
- spring - 如何解决不支持的请求方法“POST”?
- ios - ios 发布版本中的 FCM InvalidRegistration 错误
- python - 错误消息:从 selenium 导入 webdriver “我在我的 pc windows 10 中安装 selenium,并使用 Spyder 运行 python 代码”
- prolog - 问题:如何实现 A=a/1, B = b/3, C=A+B 导致 C = a/1 + b/3?
- javascript - 除了单击按钮外,如何在 jQuery 中触发模糊?
- android - 完整的 Google 登录示例 FrontEnd & BackEnd With Code in android studio
- python - 使用 Python-OGR 将 OSM 数据加载到 PostgreSQL
- c# - 将替代记录设置为真,如果它的偶数计数,否则离开最后一条记录
- php - 如何在 PHP 中拆分一些数字和数学运算符?
- python - 在python中的列表中查找连续的子序列