如何在Scala中使用Circe将嵌套json解码为列表[对象]
我有一个json,看起来有点像这样:如何在Scala中使用Circe将嵌套json解码为列表[对象],json,scala,circe,Json,Scala,Circe,我有一个json,看起来有点像这样: implicit val singleResultDecoder: Decoder[SingleResult] = deriveDecoder[SingleResult] implicit val ResultsDecoder: Decoder[Results] = new Decoder[Results] { override def apply(c: HCursor): Result[Results] = { for {
implicit val singleResultDecoder: Decoder[SingleResult] = deriveDecoder[SingleResult]
implicit val ResultsDecoder: Decoder[Results] = new Decoder[Results] {
override def apply(c: HCursor): Result[Results] = {
for {
results <- c.keys.map(_.map(k => c.downField(k).as[SingleResult]).toList)
} yield Results(results = results)
}
}
{
“结果”:{
“结果1”:{
“文本”:“abc”
},
“结果2”:{
“文本”:“def”
}
}
}
我希望将其解码为一个case类,如下所示:
case class Results(results: List[SingleResult])
case class SingleResult(text: String)
我希望为此编写一个解码器,但我当前的解码器尚未编译。看起来是这样的:
implicit val singleResultDecoder: Decoder[SingleResult] = deriveDecoder[SingleResult]
implicit val ResultsDecoder: Decoder[Results] = new Decoder[Results] {
override def apply(c: HCursor): Result[Results] = {
for {
results <- c.keys.map(_.map(k => c.downField(k).as[SingleResult]).toList)
} yield Results(results = results)
}
}
任何关于如何修复错误的指导都将不胜感激。您在这里混合了一些东西。在json中,您没有列表,因为您正在尝试读取它。你有地图。因此,我们需要相应的
解码器
:
implicit val ResultsDecoder: Decoder[Results] = new Decoder[Results] {
override def apply(c: HCursor): Result[Results] = {
for {
results <- c.downField("results").as[Map[String, SingleResult]]
} yield Results(results = results.values.toList)
}
}
结果:
Right(Results(List(SingleResult(abc), SingleResult(def))))
代码运行。您在这里混合了一些东西。在json中,您没有列表,因为您正在尝试读取它。你有地图。因此,我们需要相应的
解码器
:
implicit val ResultsDecoder: Decoder[Results] = new Decoder[Results] {
override def apply(c: HCursor): Result[Results] = {
for {
results <- c.downField("results").as[Map[String, SingleResult]]
} yield Results(results = results.values.toList)
}
}
结果:
Right(Results(List(SingleResult(abc), SingleResult(def))))
代码运行