【发布时间】:2019-01-09 19:48:06
【问题描述】:
大家好,我有一些奇怪的 json,需要将其转换为允许 spark 解析它的类型。所以我决定使用jackson lib来加载它作为值。所以杰克逊为我创造了这样的东西:
地图(A-> 地图(B-> 地图(C-> C, CC-> CC, CCC-> CCC, CCCC-> , CCCC-> 地图(D-> ....
现在我需要做的是将每个地图将被包装的整个结构转换为 List :
Map(A-> List(Map(B-> List(Map(C-> C, CC-> CC, CCC-> CCC, CCCC-> CCCC)) List(Map(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"
}
}
}
ANSWER如果我们不想映射 List(Map(k -> Map(k -> v))),这是我在 @Dima 帮助下的解决方案
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
}
【问题讨论】: