首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Circe解码案例类

Circe解码案例类
EN

Stack Overflow用户
提问于 2018-10-10 20:40:36
回答 1查看 1.3K关注 0票数 0

我有一个案例课如下:

代码语言:javascript
复制
case class Road(id: String, light: TrafficLight, cars: Map[String, String])

简单地说,我正在尝试 Json解码为ListRoad

我想要解码的Json是:

代码语言:javascript
复制
[   
   {
        "id" = "A",
        "light" = "green",
        "cars": [
          {
            "Nissan" : "100"
          }
        ]
    }
]

TrafficLight是基本的枚举:

代码语言:javascript
复制
object TrafficLight extends Enumeration {
    type TrafficLight = Value
    val red, yellow, green = Value
}

我为交通灯建立了编解码器

代码语言:javascript
复制
implicit val trafficLightDecoder: Decoder[TrafficLight.Value] = Decoder.enumDecoder(TrafficLight)
implicit val trafficLightEncoder: Encoder[TrafficLight.Value] = Encoder.enumEncoder(TrafficLight)

我还为的字符串类型构建了一个MapString编码器

代码语言:javascript
复制
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案例类:

代码语言:javascript
复制
implicit val roadDecoder: Decoder[Road] = deriveDecoder
implicit val roadEncoder: Encoder[Road] = deriveEncoder

现在,我正在尝试将json解析为List[Road]

代码语言:javascript
复制
roadJson.as[List[Road]].toOption.getOrElse(List[Road]())

但我无法解码它-我总是得到一个空的列表,因为在getOrElse方法中的“其他”,没有任何错误。

我做错了什么?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-10-10 21:07:27

当您使用.toOption.getOrElse时,您将放弃解析json时可能返回的错误。

如果要查看错误,则需要查看roadJson.as[List[Road]]返回的值。

我在这里最喜欢的选择是使用模式匹配来查看结果:

代码语言:javascript
复制
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无效,它使用=而不是:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52748469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档