Json4s не может десериализовать в scala - PullRequest
0 голосов
/ 06 марта 2020

Мне нужна помощь в json десериализации в scala с использованием Json4s. Я получаю следующую ошибку при попытке десериализации json

scala.collection.immutable.Map$Map1 cannot be cast to 
 LocationServiceTest$$anonfun$1$LocationList$3
 java.lang.ClassCastException: scala.collection.immutable.Map$Map1 cannot be cast to 
 LocationServiceTest$$anonfun$1$LocationList$3
at LocationServiceTest$$anonfun$1.apply$mcV$sp(LocationServiceTest.scala:34)
at LocationServiceTest$$anonfun$1.apply(LocationServiceTest.scala:16)
at LocationServiceTest$$anonfun$1.apply(LocationServiceTest.scala:16)

My Json следующим образом:

    {
  "locations" : [
    {
      "country": "YY",
      "placeName": "YY",
      "latitude": "YY",
      "longitude": "YY"
    },
    {
      "country": "XX",
      "placeName": "XX",
      "latitude": "XX",
      "longitude": "XX"
    },

Мой код:

case class Location(country: String, placeName: String, latitude: Double, longitude: Double)
 val locations = parse(scala.io.Source.fromFile("input.json").mkString)
  println(locations.values.asInstanceOf[LocationList])

Использование извлечения (формат, манифест) также не удается .. Может кто-нибудь, пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Код показан ниже:

object Test extends App {
  import org.json4s._
  import org.json4s.jackson.JsonMethods._
  implicit val formats =DefaultFormats

  val str = scala.io.Source.fromFile("input.json").mkString

  case class Location(country: String, placeName: String, latitude: String, longitude: String)

  val dataObj= parse(str)
  val locObj = (dataObj \ "locations").extract[Seq[Location]]

  println(locObj)
}

Вывод:

List(Location(YY,YY,YY,YY), Location(XX,XX,XX,XX))

Обратите внимание, что в случае, когда класс, широта и долгота являются строками, поскольку в json вы их объявили в виде строки.

Дайте мне знать, если это поможет !!

1 голос
/ 06 марта 2020

Функция parse создает JValue (JSON представление в типах Scala, таких как Map, Array и примитивных типах). Этот тип никак не связан с каким-либо пользовательским типом, таким как LocationList. Для этого вам нужно использовать json.extract. См. https://github.com/json4s/json4s Извлечение значений :

Классы case можно использовать для извлечения значений из проанализированного JSON

json.extract[Person]

...