我有一个案例课如下:
case class Road(id: String, light: TrafficLight, cars: Map[String, String])简单地说,我正在尝试将 Json解码为ListRoad。
我想要解码的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)我还为的字符串类型构建了一个MapString编码器:
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方法中的“其他”,没有任何错误。
我做错了什么?提前谢谢。
发布于 2018-10-10 21:07:27
当您使用.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无效,它使用=而不是:。
https://stackoverflow.com/questions/52748469
复制相似问题