繁体   English   中英

循环解码案例类

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM