![](/img/trans.png)
[英]JSON decode nested field as Map[String, String] in Scala using circe
[英]How to decode a nested json into a List[Object] using Circe in Scala
我有一個看起來有點像這樣的 json:
{
"results": {
"result_1": {
"text": "abc"
},
"result_2": {
"text": "def"
}
}
}
我希望將其解碼為一個看起來像這樣的案例 class:
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)
}
}
編譯錯誤是:
Type mismatch :
Required: scala.List[SingleResult]
Found: scala.List[Result[SingleResult]]
任何有關如何修復錯誤的指示將不勝感激。
你在這里混合了一些東西。 在您的 json 中,您沒有列表,因為您正在嘗試閱讀它。 你有一個 map。 因此我們需要相應的Decoder
:
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)
}
}
然后調用:
val decodedFoo = circe.jawn.decode[Results](jsonString)
println(decodedFoo)
結果是:
Right(Results(List(SingleResult(abc), SingleResult(def))))
代碼在Scastie中運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.