Проблема с модулем Джексона в Scala 2.11 с фильтрами - PullRequest
1 голос
/ 09 мая 2020

Недавно я пытался сделать простой код Scala для анализа данных COVID - 19, я вызвал один API и привел структуру этого вызова JSON API к моим Scala классам case. Если я не применяю фильтры, код работает должным образом. Когда я пытаюсь применить фильтр, он не работает. Немного смущает. Почему не работает.

case class RegionData(region: Option[String], totalInfected: Option[String], recovered: Option[String], deceased: Option[String])

case class Data(activeCases: String, recovered: String, deaths: String, totalCases: String, sourceUrl: String, lastUpdatedAtApify: String, readMe: String, regionData: Option[List[RegionData]])

Это мои классы для Scala.

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule

import scala.io.Source

object CovidAnalytics {
  val objectMapper: ObjectMapper = new ObjectMapper()
  objectMapper.registerModule(DefaultScalaModule)

  def main(args: Array[String]): Unit = {
    val getData: String = Source.fromURL("https://api.apify.com/v2/datasets/58a4VXwBBF0HtxuQa/items?format=json&clean=1").mkString
    val data: List[Data] = objectMapper.readValue(getData, classOf[List[Data]])
    //This is working
    println(data)

    val filter = data.filter(e => e.deaths != "")
    //This is not working (Confused!!!)
    println(filter)
  }
}

Исключение в потоке «main» java .lang.ClassCastException: scala .collection.immutable.HashMap $ HashTrieMap не может быть преобразован в com.example.analytics.Data в com. .example.analytics.CovidAnalytics $$ anonfun $ 1.apply (CovidAnalytics. scala: 18) в scala .collection.TraversableLike $$ anonfun $ filterImpl $ 1.apply (TraversableLike. scala: 248) в scala .collection.immutable.List.foreach (List. scala: 392) в scala .collection.TraversableLike $ class.filterImpl (TraversableLike. scala: 247) в scala .collection.TraversableLike $ class.filter (TraversableLike. scala: 259) в scala .collection.AbstractTraversable.filter (Traversable. scala: 104) в com.example.analytics.CovidAnalytics $ .main (CovidAnalytics. scala: 18) в com .example.analytics.CovidAnalytics.main (CovidAnalytics. scala)

1 Ответ

1 голос
/ 09 мая 2020

Это происходит из-за стирания типа. Вы можете заменить List на Array.

    val getData: String = Source.fromURL("https://api.apify.com/v2/datasets/58a4VXwBBF0HtxuQa/items?format=json&clean=1").mkString

    val data = objectMapper.readValue(getData, classOf[Array[Data]]).toList //.toList if you need it as List
    println(data)

    val filter = data.filter(e => e.deaths != "")
    println(filter)
...