簡體   English   中英

如何使用 Scala 中的 Circe 將嵌套的 json 解碼為 List[Object]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM