Используя jerkson в scala для списка списков

У меня есть следующее, и я хочу использовать jerkson в Scala, но у меня есть проблемы с этим. Я уверен, что это очень любительская ошибка, но надеялся получить отсюда помощь.

  scala> val orig=List("this", List("a", "b", List("c", "d")))
  orig: List[java.lang.Object] = List(this, List(a, b, List(c, d)))

 val json_ver=generate(orig)
 json_ver: String = ["this",["a","b",["c","d"]]]

 //now i want to go from json_ver back to orig list of lists
 //I've tried parse[List[Any]](json_ver)
 //parse[List[List[Any]]](json_ver)

Все безрезультатно. Я был бы очень признателен, если бы кто-то мог указать мне правильное направление

1 ответ

Слово предупреждения: оригинальная Codahale Jerkson был заброшен, и нет официальной сборки для Scala 2.10 (хотя есть некоторые вилки Github для 2.10). jackson-module-scala (который jerkson обертывания), с другой стороны, полностью поддерживается и поддерживается.

[ РЕДАКТИРОВАТЬ ] после прояснения вопроса.

Исходная структура данных использует List с Any (List с и String с). Тот, который возвращается от парсера List, но списки внутри него java.util.ArrayList, Этот тип также является списком, но не тем же самым и не вписывается в коллекции Scala как изначально. Среди прочего, он имеет другую реализацию toString, поэтому выход отличается. Обратите внимание, что это все еще список Any Только не Скала List s.

Один из способов решения этой проблемы - использовать конвертеры коллекций для преобразования в Scala:

import scala.collection.JavaConverters._
// somewhere down the line
val parsedList = parse[List[Any]](json_ver)

parsedList.foreach {
   case s: String => println("string: " + s)
   case l: util.ArrayList[Any] => doSomething(l.asScala.toList)
}

...
def doSomething(lst: List[Any]) {
   println(lst)
}

Другой способ заключается в том, что если бы вы использовали Джексона, вы могли бы настроить его для использования массивов Java:

val mapper = new ObjectMapper()
mapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true)
mapper.registerModule(DefaultScalaModule)
mapper.readValue[List[Any]](json_ver, classOf[List[Any]])
Другие вопросы по тегам