Используя 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]])