每当我调用getJsonKeyValue时,它应该打印输出,如下所示,我如何存储getJsonKeyValue的值并相应地使用。
getJsonKeyValue(WithMap: Map[String, Any])
def getJsonKeyValue(mapIs: Map[String, Any]) {
mapIs.foreach {
case (k: String, v: List[Map[String, Any]]) => v.foreach(x => getJsonKeyValue(x))
case (k: String, v: Any) => (k + "=" + v)
}
}
mapIs
Map(RedDef -> List(Map(RedTypP -> ^.{14}XY.*$, RedTypC -> XY, ExpNoOfAt -> 19, attributes -> List(Map(AttId -> 1, AttNa -> Pro Ty, AttMaxLen -> 1, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 2, AttNa -> Pro Cod, AttMaxLen -> 6, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 3, AttNa -> REQ CODE, AttMaxLen -> 7, DataTy -> Map(DataTyName -> AN))), RedLen -> 117, RedDeIn -> 2, MinNoOfAt -> 19), Map(RedTypP -> ^.{14}JK.*$, RedTypC -> JK, ExpNoOfAt -> 10, attributes -> List(Map(AttId -> 1, AttNa -> Log Si Ty, AttMaxLen -> 1, DataTy -> Map(DataTyName -> A)), Map(AttId -> 2, AttNa -> Log Si Cod, AttMaxLen -> 6, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 3, AttNa -> Ex Qu Cod, AttMaxLen -> 7, DataTy -> Map(DataTyName -> AN))), RedDeIn -> 3, MinNoOfAt -> 10), Map(RedTypP -> ^.{14}FK.*$, RedTypC -> FK, ExpNoOfAt -> 33, attributes -> List(Map(AttId -> 1, AttNa -> Pro Ty, AttMaxLen -> 1, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 2, AttNa -> Pro Cod, AttMaxLen -> 6, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 3, AttNa -> REQ CDE, AttMaxLen -> 7, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 4, AttNa -> RED Ty, AttMaxLen -> 2, DataTy -> Map(DataTyName -> AN))), RedLen -> 117, RedDeIn -> 4, MinNoOfAt -> 33)))
输出来自getJsonKeyValue
RedTypP = ^.{14}XY.*$
RedTypC = XY
ExpNoOfAt = 19
AttId = 1
AttNa = Pro Ty
AttMaxLen =1
DataTyName = AN
AttId = 2
AttNa = Pro Cod
AttMaxLen = 6
DataName = AN
AttId = 3
AttNa = REQ CODE
AttMaxLen = 7
DataTyName = AN
RedLen = 117
RedDeIn = 2
MinNoOfAt =19
答案 0 :(得分:0)
您可以使用mapValues
将函数应用于地图中的每个值:
def getJsonKeyValue(mapIs: Map[String, Any]) :Map[String, Any] = {
mapIs.mapValues {
case (v: List[Map[String, Any]]) => v.map(x => getJsonKeyValue(x))
case (v: Any) => v
}
}
答案 1 :(得分:0)
这个写得不好的问题有很多问题。我将按严重程度对其进行解决。
case (k: String, v: Any) => (k + "=" + v)
此行返回String
,但周围的foreach()
返回Unit
,因此该结果字符串将被丢弃。有两个简单的解决方案:1)使用map
(或其他一些集合操作)而不是foreach
来收集结果字符串,或2)使用println()
输出结果字符串。 println
会返回Unit
,与foreach
结果匹配。
您的示例数据包含String->Map
条目,您的代码和预期输出不会占用该条目。
您提供的样本数据多于生成所需输出所需的样本数据,并且不仅仅是解释问题所需的方式。 (请阅读this page on submitting MCV code示例。)它也没有引号"
,因此必须先添加它们才能用于测试。
考虑到这些因素,以下内容会编译许多警告,但它会产生与您正在寻找的内容相匹配的输出。
def getJsonKeyValue(mapIs: Map[String, _]): Unit = {
mapIs.foreach {
case (k: String, v: List[Map[String, _]]) => v.foreach(getJsonKeyValue)
case (k: String, v: Map[String, _]) => getJsonKeyValue(v)
case (k: String, v) => println(k + "=" + v)
}
}
<强>更新强>
这是一个返回字符串表示的版本。
def getJsonKeyValue(mapIs: Map[String, _]): Iterable[String] = {
mapIs.flatMap {
case (k: String, v: List[Map[String, _]]) => v.flatMap(getJsonKeyValue)
case (k: String, v: Map[String, _]) => getJsonKeyValue(v)
case (k: String, v) => Iterable(k + "=" + v)
}
}