[英]Circe decode case class
我有一個案例類 ,如下所示:
case class Road(id: String, light: TrafficLight, cars: Map[String, String])
簡而言之,我正在嘗試將Json 解碼為List [Road] 。
我要解碼的Json是:
[
{
"id" = "A",
"light" = "green",
"cars": [
{
"Nissan" : "100"
}
]
}
]
TrafficLight
是基本枚舉:
object TrafficLight extends Enumeration {
type TrafficLight = Value
val red, yellow, green = Value
}
我已經為交通信號燈構建了編碼器和解碼器 :
implicit val trafficLightDecoder: Decoder[TrafficLight.Value] = Decoder.enumDecoder(TrafficLight)
implicit val trafficLightEncoder: Encoder[TrafficLight.Value] = Encoder.enumEncoder(TrafficLight)
我還為Map [String,String]類型構建了一個編碼器 :
implicit val encodeMap: Encoder[Map[String, String]] = new
Encoder[Map[String, String]] {
override def apply(values: Map[String, String]): Json = {
values.toList
.map(pair => Json.obj(
(pair._1, pair._2.asJson)
)).asJson
}
}
最后, Road案例類的編碼器和解碼器 :
implicit val roadDecoder: Decoder[Road] = deriveDecoder
implicit val roadEncoder: Encoder[Road] = deriveEncoder
現在,我正在嘗試將json解析為List[Road]
。
roadJson.as[List[Road]].toOption.getOrElse(List[Road]())
但是我無法對其進行解碼-由於getOrElse
方法中的“ else”,我總是得到一個空列表,沒有任何錯誤。
我究竟做錯了什么? 提前致謝。
當您使用.toOption.getOrElse
您將丟棄解析json時可能返回的錯誤。
如果要查看錯誤,則需要查看roadJson.as[List[Road]]
返回的值
我最喜歡的選擇是使用模式匹配來查看結果:
roadJson.as[List[Road]] match {
case Left(error) =>
println(error) // print to debug the error
... // do something in case of error
case Right(roads) => ... // do something else
}
另外,您粘貼的json無效,它使用=
代替:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.