【问题标题】:Circe decode case classCirce 解码案例类
【发布时间】:2019-03-15 20:26:40
【问题描述】:

我有一个案例类如下:

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”,我总是得到一个空列表,没有任何错误。
我究竟做错了什么?提前致谢。

【问题讨论】:

    标签: json scala circe


    【解决方案1】:

    当您使用 .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 也是无效的,它使用 = 而不是 :

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 1970-01-01
      • 2019-06-05
      • 2018-10-22
      • 2018-05-03
      • 2018-10-31
      • 2020-05-16
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多