Привет, ребята. У меня есть какой-то странный JSON, и мне нужно преобразовать его в тип, который позволит анализировать спарк. Поэтому я решил использовать Jackson lib, чтобы загрузить его в качестве значения. Так что Джексон создает для меня что-то вроде этого:
Карта (A-> Карта (B-> Карта (C-> C, CC-> CC, CCC-> CCC, CCCC->, CCCC-> Карта (D-> ....
Теперь мне нужно преобразовать всю структуру, в которую каждая карта будет помещена в список:
Карта (A-> Список (Карта (B-> Список (Карта (C-> C, CC-> CC, CCC-> CCC, CCCC-> CCCC)) Список (Карта (D-> ....
Я пробовал что-то подобное, но это помогает мне только для первого значения. Также мне нужно проверить, является ли это Картой причины, иногда это может быть Список, который я не хочу переносить
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val parsedJson = mapper.readValue[Map[String, Object]](j)
val b = parsedJson.map {
case (k,v) if v.isInstanceOf[Map[String, Object]] => (k,List(v))
}
Ребята, вы хоть представляете, как я могу сделать это рекурсивно, что в конце концов мой Json будет выглядеть так:
{
"A":[{
"B":[{
"C":"C",
"CC":"CC",
"CCC":"CCC"
}]
}]
}
{ //and not like that
"A":{
"B":{
"C":"C",
"CC":"CC",
"CCC":"CCC"
}
}
}
ОТВЕТ Если мы не хотим отображать List (Map (k -> Map (k -> v))), это мое решение с помощью @Dima help
def wrapIt(m: Map[String, Any]): Map[String, Any] = m.map {
case (k, v: Map[String, Any]) => k -> List(wrapIt(v))
case (k, v: List[Map[String, Any]]) => k -> v.map(m => m.map {
case (l, p: Map[String, Any]) => l -> List(wrapIt(p))
case lp => lp
})
case kv => kv
}