Как я могу обернуть вложенные карты в список и записать его рекурсивно до последнего элемента json? - PullRequest
0 голосов
/ 09 января 2019

Привет, ребята. У меня есть какой-то странный 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
}

1 Ответ

0 голосов
/ 09 января 2019

Вы забыли сделать рекурсивную часть:)

 def wrapIt(m: Map[String, Any]): Map[String, Any] = m.map {
   case (k, v: Map[String, Any]) => k -> List(wrapIt(v))
   case kv => kv //                           ^^^^^^^ - magic!
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...