Класс случая декодирования Circe - PullRequest
0 голосов
/ 10 октября 2018

У меня есть класс дел , как показано ниже:

case class Road(id: String, light: TrafficLight, cars: Map[String, String])

Просто я пытаюсь декодировать Json в Список [Дорога] .
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)

Я также создал кодер для карты [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]())

Но я не могу его декодировать - я всегда получаю пустой список, из-за "else" в методе getOrElse, без каких-либо ошибок.
Что я делаю не так?Заранее спасибо.

1 Ответ

0 голосов
/ 11 октября 2018

Когда вы используете .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 недопустим, он использует = вместо :

...