【问题标题】:How I can wrap nested maps into list and write it recursive till last of element of json?如何将嵌套映射包装到列表中并将其递归写入 json 元素的最后一个?
【发布时间】: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
}

【问题讨论】:

    标签: json scala jackson


    【解决方案1】:

    你忘了做递归部分:)

     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!
     }
    

    【讨论】:

    • 非常感谢!这就是我需要的!
    猜你喜欢
    • 2019-01-02
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多